서블릿 필터와 스프링 인터셉터
Categories: spring
Tags: filter, inteceptor, spring, validation
서블릿 필터란?
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)
}
}
Leave a comment