Spring Web Mvc Interceptors란

[Spring Web MVC] Interceptors

인터셉터란?

아래 그림처럼 client의 요청이 controller로 가기 전에 중간에 요청을 가로채서 검사하는 모듈이야. 정확히는 컨트롤러의 핸들러를 호출하기 전과 후에 요청과 음답을 참조하거나 가공할 수 있는 녀석이라고 보면 될 거 같애




인터셉터 만들기


HandlerInterceptor

  • 먼저 spring.framework.web.servlet에 위치하는 HandlerInterceptor 인터페이스의 custom 구현체를 만들어 줍니다. (이렇게 만든 interceptor를 설정 정보에 등록하여 사용하는 방식)

  • HandlerInterceptor 인터페이스는 3개의 default method를 가지고 있습니다. 각각은 interception 하는 포인트가 다르다고 보면 됩니닷

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
    }
    • preHandle : handler가 실행되기 전 interception point를 가집니다. 즉 controller에게 가기 전에 가로채어 추가적인 작업을 진행가능 합니다.
      true를 반환할 경우 핸들러에 접근, false일 경우 작업 중단 (중단의 경우 컨트롤러와 남은 인터셉트는 당연히 실행 안되겠지)
    • postHandle : handler의 성공적인 실행 이후 interception point를 가집니다. 즉 핸들러 실행은 완료되었으나 view 가 생성되기 전에 호출됩니다.
    • afterCompletion : 모든 작업이 완료된 후에 실행이 됩니다. (view가 정상적으로 랜더링 된 후 마지막에 실행)
    • 참고 : interceptor는 여러개를 등록할 수 있는데 이때 preHandler은 등록한 순서대로, 나머지는 그 역순으로 먹혀



    Interceptor 및 url pattern 등록

    1. configuration with java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LocaleChangeInterceptor());
    registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
    registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
    }
    1. configuration with xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/admin/**"/>
    <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
    <mvc:mapping path="/secure/*"/>
    <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
    </mvc:interceptors>






https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config-interceptors

https://jhkang-tech.tistory.com/53

https://www.baeldung.com/spring-mvc-handlerinterceptor