임도현의 성장
Spring-Boot Interceptor 본문
인터셉터 Interceptor 란?
스프링 인터셉터는 스프링 MVC가 제공하는 기술이다
스프링부트에서 인터셉터는 웹 애플리케이션에서 요청과 응답을 처리하는 중간 단계에서 사용된다.
인터셉터는 특정 URI 패턴에 대한 요청을 가로채어, 컨트롤러가 처리하기 전후에
추가적인 작업을 더욱 효율적으로 할 수 있게 해 준다.
1. 스프링 인터셉터 흐름
- 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
- 스프링 인터셉터는 체인으로 구성되는데, 중간에 인터셉터를 자유롭게 추가할 수 있다. 예를 들어서 로그를 남기는 인터 셉터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 인터셉터를 만들 수 있다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
2. HandlerInterceptor 추상 메서드
- HandlerInterceptor 로 들어가보면 추상 메서드를 포함하고 있다.
- preHandle : 컨트롤러 호출 전에 호출된다.
- postHandle : 컨트롤러 호출 후에 호출된다. 컨트롤러에서 예외가 발생하면 postHandle 은 호출되지 않는다.
- afterCompletion : 뷰가 렌더링 된 이휴에 호출된다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
3. HandlerInterceptor 인터페이스 구현
나는 로그인 여부를 체크하는 인터셉터를 만들기 위해 preHandle 만 사용하였다.
- 세션이 비어있거나 로그인이 되어있지 않으면 로그인 뷰로 Reditect 하기로 했다.
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI(); // 어디 URI로 왔는지
log.info("인증 체크 인터셉터 실행 {}", requestURI);
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청");
//로그인으로 redirect
response.sendRedirect("/login?redirectURL=" + requestURI);
return false; //false == 진행X
}
return true; // true == 정상 호출 다음 인터셉터나 컨트롤러가 호출된다.
}
}
4. WebConfig 인터셉터 등록
WebMvcConfigurer 가 제공하는 addInterceptors() 를 사용해서 인터셉터를 등록할 수 있다.
- registry.addInterceptor(new LogInterceptor()) : 인터셉터를 등록한다.
- order(1) : 인터셉터의 호출 순서를 지정한다. 낮을 수록 먼저 호출된다.
- addPathPatterns("/**") : 인터셉터를 적용할 URL 패턴을 지정한다.
- excludePathPatterns("/css/**", "/*.ico", "/error") : 인터셉터에서 제외할 패턴을 지정한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor()) // 로그인 인중 체크
.order(1)
.addPathPatterns("/**")
.excludePathPatterns(
"/", "/members/add", "/login", "/logout",
"/css/**", "/*.ico", "/error", "/error-page/**"
);
}
}
5. 실행
실행을 시켜보면 URL이 로그인 뷰로 Reditect하는 것을 알 수 있다.
http://localhost:8008/login?redirectURL=/file/items/new
참고 자료
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 참고
'Spring Boot' 카테고리의 다른 글
Spring Data JPA + Query Dsl JPA (2) | 2024.09.07 |
---|---|
Spring-Boot H2 데이터베이스 설정과 연결 (1) | 2024.09.02 |
Spring-Boot MyBatis (0) | 2024.09.01 |
Spring-Boot Cookie Session (1) | 2024.08.13 |
Spring-Boot Bean validationn (0) | 2024.07.25 |