본문 바로가기
스프링(부트)/스프링 내용 정리

[스프링] Handler Interceptor

by doflamingo 2020. 5. 3.

Handler Interceptor는  컨트롤러에 대한 요청을 가로채는데 사용된다. 

예를 들어, 요청 전 후에 일부 처리를 원할 수 있다. 요청 및 응답의 내용을 기록하거나 특정 요청의 소요된 시간을 알아내야 할 수도 있다. 

 

HandlerInterceptor를 만드는 데는 두가지 단계가 필요하다. 

 

  1.  HandlerInterceptor를 정의한다. 
  2.  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를 구분하여 

인터셉트를 사용할 URImapping path에 넣어주고 인터셉트를 하지 않을 URIexclude-mapping path에 넣어준다. 

댓글