핸들러 매핑에 자리잡고 있는 인터셉터는 반드시 org.springframework.web.servlet 패키지 안에 있는 HandlerInterceptor를 구현하여야 한다.
이 인터페이스는 다음과 같은 세가지 메서드를 정의하고 있다.
preHandle 은 실질적인 handler가 실행되기 전에 호출된다.
postHandle 은 handler가 실행되고 난 이후에 호출된다.
afterCompletion은 완전한 request가 끝나고 호출된다.
preHandle 메서드는 boolean 값을 return한다. 당신은 이 메서드를 execution chain의 진행을 멈추거나, 이어하기 위해 사용할 수 있다.
이 값이 true를 return 할 때, handler chain은 이어질 것이다. 만약 false를 return하게 되면, DispatcherServlet은 이 것을 감지하고,
더 이상 진행하지 않는다.
Interceptor는 interceptor property를 사용하여 설정될 수 있다. 이 값은 AbstractrHandlerMapping으로 부터 상속받은
모든 HandlerMapping에 존재한다. 아래의 예를 보자.
package samples; public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter { private int openingTime; private int closingTime; public void setOpeningTime(int openingTime) { this.openingTime = openingTime; } public void setClosingTime(int closingTime) { this.closingTime = closingTime; } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Calendar cal = Calendar.getInstance(); int hour = cal.get(HOUR_OF_DAY); if (openingTime <= hour && hour < closingTime) { return true; } response.sendRedirect("http://host.com/outsideOfficeHours.html"); return false; } }
이 mapping에 의한 모든 request는 TimeBasedAccessInterceptor에 의해 가로채어진다.
만약 현재 시간이 업무 시간이 아니면, 사용자는 어떠한 static HTML 파일로 redirecting될 것이다.
오직 업무 시간에만 이 웹사이트에 접근할 수 있다.
보는 바와 같이 HandlerInterceptorAdapter 는 HandlerInterceptor 인터페이스를 상속하기 쉽게 만들어준다.
HandlerInterceptor의 메서드인 postHandle 은 항상 @ResponseBody와 ResponseEntity 메서드를 사용하기에 적합한 것은 아니라는 것을 알아두자.
HttpMessageConver 같은 경우, postHandle이 호출되기 전 response를 쓰고, commit해버리기 때문에 header를 추가하는 등의 response를 바꾸는 행위를 불가능하게 만든다.
대신 @ControllerAdvice bean을 사용하거나 RequestMappingHandlerAdaptor를 설정함으로써,
ResponseBodyAdvice를 구현할 수 있다.
original source : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor
댓글 없음 :
댓글 쓰기