반응형

서블릿 예외 처리 - 인터셉터


인터셉터 중복 호출 제거

LogInterceptor - DispatcherType 로그 추가

앞서 필터의 경우에는 필터를 등록할 때 어떤 DispatcherType인 경우에 필터를 적용할 지 선택할 수 있었다.
그런데 인터셉터는 서블릿이 제공하는 기능이 아니라 스프링이 제공하는 기능이다.
따라서 DispatcherType과 무관하게 항상 호출된다.

대신에 인터셉터는 다음과 같이 요청 경로에 따라서 추가하거나 제외하기 쉽게 되어 있기 때문에, 이러한 설정을 사용해서 오류 페이지 경로를 excludePathPatterns를 사용해서 뺴주면 된다.

인터셉터와 중복으로 처리되지 않기위해 LogFilter()@Bean에 주석을 달아두자.
여기에서 /error-page/**를 제거하면 error-page/500 같은 내부 호출의 경우에도 인터셉터가 호출된다.

 

전체 흐름 정리

/hello 정상 요청

WAS(/hello, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 -> View

 

/error-ex 오류 요청

  • 필터는 DispatchType으로 중복 호출 제거 (dispatchType=REQUEST)
  • 인터셉터는 경로 정보로 중복 호출 제거(excludePathPatterns("/error-page/**"))
1. WAS(/error-ex, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러
2. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
3. WAS 오류 페이지 확인
4. WAS(/error-page/500, dispatchType=ERROR) -> 필터(x) -> 서블릿 -> 인터셉터(x) ->
컨트롤러(/error-page/500) -> View

 

반응형