2016년 2월 7일 일요일

Intercepting requests with a HandlerInterceptor

스프링의 핸들러 매핑 메카니즘은 핸들러 인터셉터를 포함한다.

핸들러 매핑에 자리잡고 있는 인터셉터는 반드시 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

댓글 없음 :

댓글 쓰기