서블릿 필터와 스프링 인터셉터

Updated:     Updated:

Categories:

Tags: , , ,

서블릿 필터란?

Client로 부터 Server로 요청이 들어오기 전에 서블릿을 거쳐서 필터링 하는 것을 서블릿 필터라고 한다. 클라이언트의 요청을 서블릿의 doDispatch()에 넘기기 전에 검증작업들을 할 수 있다.

예를 들어, 사용자 로깅이나 사용자 검증과정은 전방위적으로 필요하다. 이런 공통기능을 서블릿이 호출되기 전에 실행하거나, 호출 된 후 후처리를 할 수 있다.

출처 : https://sbsjavaprg.wordpress.com/2014/02/18/%EC%84%9C%EB%B8%94%EB%A6%BF-%ED%95%84%ED%84%B0filter-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95/

Filter 인터페이스

Filter 인터페이스는 다음 세가지 메소드가 있다.

  • init(FilterConfig config) : 서블릿 컨테이너가 필터 인스턴스를 초기화 하기 위해서 호출하는 메소드

  • doFilter(ServletRequest res, ServletResponse res,FilterChain chain): 필터에서 구현해야 하는 로직을 작성하는 메소드

  • destroy() : 필터 인스턴스를 종료시키기 전에 호출하는 메소드

이 중에서 doFilter메서드를 통해 요청에 대해 로직을 처리하면 된다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	// 로직 작성
	chain.doFilter(request, response);
	//후처리 작업
}

필터 등록방법

  • 스프링 부트를 이용하는 경우 FilterRegistrationBean을 사용해 등록할 수 있다.
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
  • 서블릿을 통해 등록하는 경우
    @ServletComponentScan @WebFilter(filterName = "logFilter", urlPatterns = "/*") 
    

스프링 인터셉터

서블릿 필터는 서블릿에서 제공하는 기술인 반면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다.

스프링 인터셉터의 흐름 HTTP 요청 ->WAS-> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러

스프링 인터셉터는 dispatcherServlet과 컨트롤러 사이에서, 컨트롤러 직전에 호출된다.

스프링 인터셉터 인터페이스

스프링 인터셉터를 구현하기 위해서는 HandlerInterceptor 인터페이스를 구현하면 된다.

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

  default void afterCompletion(HttpServletRequest request, HttpServletResponse
response,Exception) {}
 }

인터셉터는 호출 전 preHandle 메서드, 호출 후 postHandle, 요청 완료 후 afterCompletion 위와 같이 각각 필요한 부분에 메서드를 구현해 사용하면 된다.

메소드 매개변수로 넘어오는 handler는 사용한 핸들러 매핑에 따라 달라진다. @Controller 나 @RequestMapping와 같은 핸들러 매핑을 활용하는데, 이 경우에 핸들러 정보로 HandlerMethod가 넘어온다.

/resources/static 과 같은 정적 리소스를 사용하는 경우에는 ResourceHttpRequestHandler가 넘어온다.

인터셉터를 등록하려면 WebMvcConfigurer의 registry에 인터셉터를 추가하면 된다.

@Configuration
  public class WebConfig implements WebMvcConfigurer {
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
          registry.addInterceptor(new LogInterceptor())
                  .order(1)
	}
}

spring 카테고리 내 다른 글 보러가기

Leave a comment