JAVA Interceptor

박상수
6 min readSep 27, 2019

--

Interceptor 에 대해 작성을 해야될 일이 생겼다.
이에 관련하여 정리를 해보았다.

Interceptor
Interceptor란 컨트롤러에 들어오는 요청 가로채는 역할. 정식명칭은 핸들러 인터셉터(Handler Interceptor)

일단 이에 앞서 filter와 interceptor가 비슷한 역할을 하고 있기에 이에 대한 구분을 해보자.

  • 호출시점
    - Filter : DispatcherServlet 실행 전
    - Interceptor : DispatcherSelvlet이 실행된 후
  • 설정
    - Filter : web.xml
    - Interceptor : servlet.xml

인터셉터 설정(servlet.xml)

<!-- servlet.xml -->
<interceptors>
<interceptor>
<!-- 모든 url적용 -->
<mapping path="/*" />
<!-- 예외처리 -->
<exclude-mapping path="/main"/>
<!-- 적용interceptor -->
<beans:bean id="testInterceptor" class="com.main.test.interceptor.TestInterceptor" />

</interceptor>
</interceptors>

구현방법

  1. HandlerInterceptor 인터페이스를 구현
    - 구현 필수 메서드 : preHandle(), postHandle(), afterCompletion()
    - HandlerInterceptor 구현예시
public class TestInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
}
@Override afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
}
}

> 메서드 별 동작 방식

  • preHandle : 컨트롤러 실행 전에
    -> DispatcherServlet 에서 핸들러 자체를 마지막에 두고 처리, 이를 이용하여 HTTP 오류를 전달하거나 사용자 정의응답을 작성하는 등 실행 체인을 중단 할 수 있다.
  • postHandle : view를 렌더링 하기 전에 동작
    - DispatcherServlet은 실행 체인에서 처리기를 처리하며, 여러 개의 인터셉터로 구성되며 처리기 자체는 끝에 있습니다. 이 방법을 사용하면 각 인터셉터가 실행을 사후 처리하여 실행 체인의 역순으로 적용 할 수 있습니다.
  • afterCompletion : 요청 처리 완료 후, 즉 뷰를 렌더링 한 후의 콜백 핸들러 실행 결과에 따라 호출
    - preHandle 메소드가 성공적으로 완료되고 true를 리턴 한 경우에만 호출됩니다.
    - postHandle 메소드와 마찬가지로 체인의 각 인터셉터에서 역순으로 메소드가 호출되므로 첫 번째 인터셉터가 마지막으로 호출됩니다.

2. HandlerInterceptorAdapter 상속
- HandlerInterceptorAdapter 구현 예시

public class TestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return true;
}

@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable ModelAndView modelAndView) throws Exception{
} @Override
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable Exception ex) throws Exception{
} @Override
public void afterConcurrentHandlingStarted(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
}
}

> 메서드 별 동작 방식(실행 시점은 HandlerInterceptor 와 동일)

  • preHandle : 실행 체인이 다음 인터셉터, 핸들러 자체로 진행해야하는 경우 true
  • postHandle : HandlerInterceptor 와 동일, 구현은 비어있음
  • afterCompletion : HandlerInterceptor 와 동일, 구현은 비어있음
  • afterConcurrentHandlingStarted : 비동기 요청시 수행, postHandle와 afterCompletion은 실행되지 않음.

메서드별 실행 순서

*만약 filter가 있으면 filter부터 시작

(filter ->) preHandle -> controller ->postHandle -> afterCompletion

*일반적으로 로그인, 권한 체크 등에서 사용하면 편리하다.

참고

--

--

No responses yet