InterCeptor

yihyun·2024년 11월 15일

Spring Boot

목록 보기
31/33

InterCeptor (인터셉터)

우리가 프로젝트를 만들 때 로그인 기능이 포함되어 있다면 메서드에 하나하나 세션 체크를 해주었을 것이다.

하지만 그럴 경우 코드의 중복이 많아지고 결합도가 높아지는 결과를 얻게된다.
이러한 경우에 InterCeptor를 사용해주면 코드의 중복을 줄이고 결합도가 낮은 코드를 만들 수 있다.

🔽 인터셉터를 하기 위한 방법을 알아보자!
(스프링에 기본적으로 탑재되어 있기 때문에 추가적인 라이브러리가 필요없다.)

0. config(설정) 패키지 → 클래스 만들기

  • 클래스 만들 때 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 를 인터페이스로 추가
  • 클래스에 @Configurable 어노테이션 추가
    → 설정을 위한 클래스라는 표시 (이게 없으면 일반 클래스로 인식한다.)
  • alt + shift + sOverride/Implement Methods 에 들어가서 addInterceptors() 를 오버라이드 해준다.
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		
		List<String>excludeList = new ArrayList<String>();
		excludeList.add("/resources/**");//resources 이후 어떤 경로던지
		excludeList.add("/member_*"); // member_ 이후 어떤 값이던지
		excludeList.add("/checkId.*");
		// modelAndView는 리퀘스트를 기반으로 하기 때문에 ajax는 담아서 보낼 수 없어서 예외가 발생했던 것이다.
		excludeList.add("/*.ajax"); // ajax 에도 modelAndView를 담아서 보내서 null 예외가 발생함 그래서 이것도 예외로 처리해줌
		excludeList.add("/");
		
		
		// registry 에 언제 어떤 일을 할건지 등록		
		registry.addInterceptor(checker) // 인터셉터에서 실행할 클래스
		.addPathPatterns("/**") // 어떤 패턴의 URL 에 대해서 할것인가?
		.excludePathPatterns(excludeList); // 어떤 패턴을 제외시킬것인지?

	}
  • registry 언제 어떤 일을 할건지 등록해줘야 한다.
  • 그러기 위해서 Login을 체크해주는 클래스를 만들어 준다.

2. utils 패키지 → 클래스 생성

  • 클래스를 만들 때에는 import org.springframework.web.servlet.HandlerInterceptor; 인터페이스를 구현받아준다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

// 이 클래스는 인터셉터에서 객체화 해서 쓸래?
//@Autowierd 로 끌어당겨 쓰려면 @Componenet
@Component
public class LoginChecker implements HandlerInterceptor {
	
	Logger logger = LoggerFactory.getLogger(getClass());

	// 컨트롤러에 들어가기 전에 체크
	@Override
	public boolean preHandle(HttpServletRequest request, 
				HttpServletResponse response, Object handler)
			throws Exception {
		
		logger.info("====PRE HANDLER====");
		HttpSession session = request.getSession();
		
		if(session.getAttribute("loginId") == null) {			
			String ctx = request.getContextPath();
			logger.info("context path : "+ctx);
			response.sendRedirect(ctx);
		}
				
		return true;// true : 컨트롤러로 접근/ false : 못가고 그냥 하얀화면
	}

	// 컨트롤러를 지나 뷰에 가기 전에 체크
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, 
			Object handler,	ModelAndView modelAndView) throws Exception {
		logger.info("====POST HANDLER====");
		
		HttpSession session = request.getSession();
		
		String msg = "<p>안녕하세요,"+session.getAttribute("loginId")+"님!";
		msg += "<a href=\"member_logout.do\" class=\"btn minbtn\">로그아웃</a></p>";
		modelAndView.addObject("loginBox", msg);
	}
	
	

}
  • @AutoWierd 로 끌어 당겨 쓰기위해 @Componenet 선언
    → @Component : 서비스도 아니고 컨트롤러도 아니지만 AutoWierd를 사용하기 위해 빈 등록을 해야해서 사용해준다.
  • 헤더에 항상 따라다니는 로그인 관련 내용 노출을 위해 postHandle에 값을 넣어준다.

🔽 view 에서 사용 예시

	<div class="header full">
		${loginBox}
	</div>
profile
개발자가 되어보자

0개의 댓글