Handler Interceptor는 컨트롤러에 대한 요청을 가로채는데 사용된다.
예를 들어, 요청 전 후에 일부 처리를 원할 수 있다. 요청 및 응답의 내용을 기록하거나 특정 요청의 소요된 시간을 알아내야 할 수도 있다.
HandlerInterceptor를 만드는 데는 두가지 단계가 필요하다.
- HandlerInterceptor를 정의한다.
- HandlerInterceptor를 인터셉트할 특정 핸들러에 매핑한다.
HandlerInterceptor 정의
public class HandlerTimeLoggingInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = Logger
.getLogger(HandlerTimeLoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("startTime", System.currentTimeMillis());
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
request.setAttribute("endTime", System.currentTimeMillis());
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
long startTime = (Long) request.getAttribute("startTime");
long endTime = (Long) request.getAttribute("endTime");
logger.info("Time Spent in Handler in ms : " + (endTime - startTime));
}
}
HandlerInterceptor는 HandlerInterceptorAdapter을 상속하는데 상속받는 메서드는 세가지가 있다.
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
return true;
}
preHandle 메서드는 인터셉트하고자하는 메서드가 호출되기전에 호출되는 메서드이다.
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
postHandle 메서드는 인터셉트하고자하는 메서드가 호출된 후 호출되는 메서드이다.
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
요청처리가 완료된 후 호출되는 메서드이다.
HandlerInterceptor를 핸들러(컨트롤러)에 매핑
HandlerInterceptors는 인터셉트하고자하는 특정 URL에 매핑될 수 있다.
이것도 xml 콘텍스트로 구성할 수 있다.
<mvc:interceptors>
<bean class="me.bosuksh.springmvc.interceptor.HandlerTimeLoggingInterceptor"/>
<mapping path="/**"/>
<exclude-mapping path="/secure/**"/>
</mvc:interceptors>
interceptor로 사용할 클래스를 xml파일에 빈으로 등록해주고
인터셉트 하고 싶은 URI와 하지 않을 URI를 구분하여
인터셉트를 사용할 URI는 mapping path에 넣어주고 인터셉트를 하지 않을 URI는 exclude-mapping path에 넣어준다.
'스프링(부트) > 스프링 내용 정리' 카테고리의 다른 글
JPA (Java Persistence API) (0) | 2021.01.05 |
---|---|
[스프링] Spring Data (0) | 2020.05.24 |
[스프링] Spring MVC 예제 및 단위테스트 (0) | 2020.04.26 |
[스프링] Spring Web MVC (0) | 2020.04.03 |
[스프링] 토비의 스프링 1.1 IoC 컨테이너 : 빈 팩토리와 애플리케이션 컨텍스트 (0) | 2020.03.01 |
댓글