[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
16public class LoginCheckInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
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 등록
- configuration with java
1
2
3
4
5
6
7
8
9
10
11
public class WebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
}
}- 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>- preHandle : handler가 실행되기 전 interception point를 가집니다. 즉 controller에게 가기 전에 가로채어 추가적인 작업을 진행가능 합니다.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config-interceptors