Spring Interceptor

wangjh789·2022년 8월 10일
0

[Spring] 스프링-mvc-2

목록 보기
7/11

스프링 인터셉터는 스프링MVC가 제공하는 기술이고 필터보다 더 다양한 기능을 제공한다.
인터셉터는 스프링MVC 구조에 특화된 필터 기능을 제공하기 때문에 필터보다 인터셉터를 사용하는게 더 편리하다.

인터셉터 흐름

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 (정상)
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 (비정상, 컨트롤러를 호출하지 않는다.)

인터셉터 체인

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러

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 {
	}

}

서블릿 필터와 달리 스프링 인터셉터는 단계적으로 잘 세분화 되어있고, request, response 포함해서 더 다양한 파라미터를 받을 수 있다.

  • preHandle() : 핸들러어뎁터 호출 전에 호출됨
    결과값이 false인 경우 나머지 인터셉터는 물론이고 핸들러 어뎁터도 호출되지 않는다.
  • postHandle() : 핸들러 어댑터 호출 후에 호출됨
  • afterCompletion() : 뷰가 렌더링된 이후에 호출됨

파라미터로 넘어오는 handler

  • HandlerMethod : @RequestMapping() 이 붙은 컨트롤러에 요청하는 경우
  • ResourceHttpRequestHandler : /resources/static 의 경로로 접근하는 요청
    어떤 타입을 띄고 있느냐에 따른 분기처리가 필요할 때 사용하면 좋다.

컨트롤러에서 예외가 터졌을 때

컨트롤러까지 요청이 전달되었다는 의미는 preHandle()은 수행이 되었다는 것이다. 컨트롤러에서 터진 예외가 핸들러 어뎁터에게 전달되고 서블릿까지 전달된다. 그 후 postHandle()은 수행되지 않고, afterCompletion()에 예외가 전달된다.

스프링 인터셉터 등록

public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns("/css/**","/*.ico","/error");
    }
}

스프링 인터셉터 패턴과 서블릿 필터 패턴과도 조금 다르다.

profile
기록

0개의 댓글