스프링 인터셉터는 스프링MVC가 제공하는 기술이고 필터보다 더 다양한 기능을 제공한다.
인터셉터는 스프링MVC 구조에 특화된 필터 기능을 제공하기 때문에 필터보다 인터셉터를 사용하는게 더 편리하다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 (정상)
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 (비정상, 컨트롤러를 호출하지 않는다.)
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
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 {
}
}
서블릿 필터와 달리 스프링 인터셉터는 단계적으로 잘 세분화 되어있고, request, response 포함해서 더 다양한 파라미터를 받을 수 있다.
파라미터로 넘어오는 handler
컨트롤러까지 요청이 전달되었다는 의미는 preHandle()은 수행이 되었다는 것이다. 컨트롤러에서 터진 예외가 핸들러 어뎁터에게 전달되고 서블릿까지 전달된다. 그 후 postHandle()은 수행되지 않고, afterCompletion()에 예외가 전달된다.
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**","/*.ico","/error");
}
}
스프링 인터셉터 패턴과 서블릿 필터 패턴과도 조금 다르다.