스프링 컨테이너
에 의해 관리되는 기능으로서 (필터는 웹 컨테이너에 의해 관리)
특정 url을 요청할 때 Controller로 가는 요청을 가로채 특정작업을 처리하는것. Controller가 응답(response)하기 전에 가로채므로 핸들러 인터셉터(Handler Interceptor)
라고도 한다.
preHandle( )
: Controller에 요청이 들어가기 전에 실행. 반환 타입이 boolean이므로 false일 경우 요청핸들러인 Controller의 실행을 차단한다.
postHandle( )
: Controller가 요청을 수행한 이후 실행. 예외가 발생하면 더이상 실행되지 않는다.
afterCompletion( )
: Controller가 요청을 수행하고 view를 반환한 이후 실행. (예외가 발생하더라도 반드시 호출된다)
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 {
}
}
// servlet-context.xml
// 인터셉터 Bean 등록
<interceptors>
<beans:bean class="com.mycom.app.interceptor.TestInterceptor"></beans:bean>
</interceptors>
// HandlerInterceptor 인터페이스의 메서드들을 구현
public class TestInterceptor implements HandlerInterceptor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("preHandle() 호출");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("postHandle() 호출");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("afterCompletion() 호출");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
이후에 프로젝트 생성시 기본으로 있는 HomeController를 호출
2023-02-14 20:58:21 INFO ExInterceptor:69 - preHandle() 호출
2023-02-14 20:58:21 INFO HomeController:27 - Welcome home! The client locale is ko_KR.
2023-02-14 20:58:21 INFO ExInterceptor:77 - postHandle() 호출
2023-02-14 20:58:21 INFO ExInterceptor:85 - afterCompletion() 호출
preHandle( ) 메서드는 HomeController 실행 전
postHandle( ) 메서드는 HomeController 실행 후
afterCompletion( ) 메서드는 view 반환 이후에 실행된것을 알 수 있다.
출처