SPRING

[SPRING] Interceptor

집한구석 2021. 7. 11. 14:58
728x90

Interceptor 정의

  • 컨트롤러의 핸들러는 호출하기 전과 후의 요청과 응답을 참조하여 가공할 수 있게 중간에 가로채서 처리하는 기능

Interceptor 실행하는 시점

https://justforchangesake.wordpress.com/2014/05/07/spring-mvc-request-life-cycle/ 참고

  • Filter는 DispatcherServlet 앞단에 처리되며, Intercepter는 그 후인 Handler와 사이 구간에서 실행이 됨
  • 왠만하면 Spring과 관련된 작업을 구현할 때는 Intercepter를 사용하는게 좋아보임

Interceptor 구성

public interface HandlerInterceptor {
  boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);
  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav);
  void afterCompletion(HttpServletRequest request, HttpServeletResponse response, Object handler, Exception ex);
}
  • Interceptor는 org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현함
  • 메서드는 preHandle(), postHandle(), afterCompletion()로 구성 
  • preHandle() : 컨트롤러 호출되기 전에 실행, 보통 호출되기전에 요청정보를 추가할 경우 사용
  • postHandle() : 핸드러가 실행 완료되었지만 View가 생성되기 이전에 실행
  • afterCompletion() : 모든 View에서 최종결과를 생성 이후 모든 작업이 완료된 뒤에 실행

Interceptor 사용법

public class LoggerInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    	logger.debug("===============================================");
		logger.debug("==================== BEGIN ====================");
		logger.debug("Request URI ===> " + request.getRequestURI());
		return super.preHandle(request, response, handler);
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception { 
        logger.debug("==================== END ======================");
		logger.debug("==============================================="); 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception { 
    }    
}
  • org.springframework.web.servlet.handler.HandlerInterceptorAdapter 클래스를 상속받아 Interceptor를 구현함
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LoggerInterceptor())
		.excludePathPatterns("/css/**", "/fonts/**", "/plugin/**", "/scripts/**");
	}
}
  • Java Config를 사용한다면, WebMvcConfigurer를 가지고 있는 addInterceptors메소드를 오버라딩하고 등록함
 <interceptors>
   <interceptor>
      <mapping path="/**"/>
      <beans:bean id="loggerInterceptor" class="tgyun615.com.interceptor.LoggerInterceptor"/>
   </interceptor>
 </interceptors>
  • Java Config를 사용안하고 xml로 설정할 경우 <mvc:interceptors>요소에 Bean으로 Interceptor를 등록함

 

'SPRING' 카테고리의 다른 글

[SPRING] Transaction Propagation  (0) 2021.09.22
[SPRING] AOP  (0) 2021.07.31
[SPRING] DISPATCHER-SERVLET  (0) 2021.06.07
[SPRING] Bean  (0) 2021.05.23
[SPRING] 컨테이너 (Container)  (0) 2021.05.23