인터셉터(Interceptor)

kmb·2023년 2월 14일
0

스프링

목록 보기
7/9
post-thumbnail

인터셉터

스프링 컨테이너에 의해 관리되는 기능으로서 (필터는 웹 컨테이너에 의해 관리)
특정 url을 요청할 때 Controller로 가는 요청을 가로채 특정작업을 처리하는것. Controller가 응답(response)하기 전에 가로채므로 핸들러 인터셉터(Handler Interceptor)라고도 한다.

 

  • HandlerInterceptor 인터페이스를 구현한 3가지 메서드
  1. preHandle( ) : Controller에 요청이 들어가기 전에 실행. 반환 타입이 boolean이므로 false일 경우 요청핸들러인 Controller의 실행을 차단한다.

  2. postHandle( ) : Controller가 요청을 수행한 이후 실행. 예외가 발생하면 더이상 실행되지 않는다.

  3. afterCompletion( ) : Controller가 요청을 수행하고 view를 반환한 이후 실행. (예외가 발생하더라도 반드시 호출된다)

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
		throws Exception {

		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}
}

 

  • 예시
// servlet-context.xml

// 인터셉터 Bean 등록
<interceptors>
	<beans:bean class="com.mycom.app.interceptor.TestInterceptor"></beans:bean>	
</interceptors>
// HandlerInterceptor 인터페이스의 메서드들을 구현
public class TestInterceptor implements HandlerInterceptor {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

		logger.info("preHandle() 호출");
		
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

		logger.info("postHandle() 호출");
		
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

		logger.info("afterCompletion() 호출");
		
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}
}

 

이후에 프로젝트 생성시 기본으로 있는 HomeController를 호출

2023-02-14 20:58:21 INFO  ExInterceptor:69 - preHandle() 호출
2023-02-14 20:58:21 INFO  HomeController:27 - Welcome home! The client locale is ko_KR.
2023-02-14 20:58:21 INFO  ExInterceptor:77 - postHandle() 호출
2023-02-14 20:58:21 INFO  ExInterceptor:85 - afterCompletion() 호출

preHandle( ) 메서드는 HomeController 실행 전
postHandle( ) 메서드는 HomeController 실행 후
afterCompletion( ) 메서드는 view 반환 이후에 실행된것을 알 수 있다.

 

출처

profile
꾸준하게

0개의 댓글