
interceptor = 가로채다
무엇을 가로챈다 말인가

sevlet container 와 springcontainer 를 보면 springContainer 속 Handler interceptor 를 찾을 수 있을 것이다.
이로써 interceptor는 디스패쳐 서블릿에서 요청 혹은 스프링 컨트롤러에서 처리후 디스패쳐서블릿으로 반환시 가로채 무엇인가를 해준다는 것을 알 수 있다.
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 {
}
}
인터셉터를 구현하기 위해서는 다음 과 같이 HandlerInterceptor 를 확장해야하는데
HandlerInterceptor 는 특이하게도 모든 메서드가 default로 되어있다.

그래서 다음같이 implements를 받아도 우리가 구현하고 싶은 메소드만 오버라이드 할 수있도록 되어있다.
그럼 HandlerInterceptor 에서 주어지는 메서드 preHandle, postHandle, afterCompletion 는 무엇인가.
우선 preHandle 부터 확인 하겠다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
return HandlerInterceptor.super.preHandle(request, response, handler);
}
다음과 같이 preHandle 메소드는 boolean return 타입이며 이름과 타입으로 추측컨데 return true 시 디스패쳐 서블릿에서 request가 spring 컨테이너로 가도록 가기전 실행 한 다는 것을 추측 할 수 있다.
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
그럼 postHandle 은 스프링 컨테이너 에서 디스패처 서블릿으로 가기 전에 수행 할 것이라 추측이 가능하다.
여기서 특이한 점은 인자값으로 ModelAndView를 받는 다는 것이다. 아마 spring 컨테이너가 모든 요청을 수행후 디스패처 서블렛으로 가니 Model AndView를 사용할 수 있을 것이다.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
afterCompletion은 이름만으로 역할을 알 수가 없어 찾아 보았다.
이 메서드는 view 찾아 디스패처 서블릿에 반환전 실행한다 한다.
그럼 실제 맞는지 실행 순서를 보도록 하겠다.
@Component("interceptor")
public class SessionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion");
}
}
다음과 같이 인터셉터를 세팅 하고 bean으로 등록을 할 것이다.
<context:component-scan base-package="com.ssafy.*.controller, com.ssafy.interceptor" />
<interceptors>
<interceptor>
<mapping path="/**"/>
<beans:ref bean="interceptor"/>
</interceptor>
</interceptors>
다음과 같이 xml 에 등록후
/ view에 해당하는 index.jsp 에 "view" 라는 System.out.println()을 수행할 것 이다.
그럼

요청시 pre 가 수행되고 그 후 post 가 실행 된 후 다시 view 리저버로 통해 view를 찾아 반환시 aftercompletion이 수행하는 것을 볼 수 있다.