필터와 인터셉터의 차이
필터
- 스프링 외부의 서블릿에서 제공하는 공통처리 기능
- 스프링 내로 요청이 들어오기 전과 스프링의 요청이 나갈 때 처리 가능
- 조금 더 low level 처리가 가능
인터셉터
- 스프링에서 제공하는 공통처리 기능
- 실제매핑된 Handler 정보 확인 가능(어떤 것이 실제 내 요청을 처리하는 지도 확인 가능
- 조금 더 상세한 조건식과, 세부적인 스펙(pre, post, after)를 통해 구체적인 시점에 구체적인 동작 가능
- AOP와 비교한다면 AOP는 인터셉터보다 더 구체적인 조건(어노테이션, 파라미터, 주소 등)과 동작 위치를 갖음
@Slf4j
@Component
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
log.info("Hello LogFilter : " + Thread.currentThread());
chain.doFilter(request,response);
log.info("Bye LogFilter : " + Thread.currentThread());
}
}
- 필터 실습 코드(요청/응답 로깅)
- 인증(로그인) 등 웹과 관련된 공통 관심사를 처리할 때는 HTTP 헤더나 URL 정보들이 필요하기 때문에 웹과 관련된 기술들이 필요함
@Slf4j
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
log.info("preHandle LogInterceptor : " + Thread.currentThread());
log.info("preHandle handler : " + handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("postHandle LogInterceptor : " + Thread.currentThread());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
log.info("afterCompletion LogInterceptor : " + Thread.currentThread());
if (ex != null){
log.error("afterCompletion exception : " + ex.getMessage());
}
}
}
- 인터셉트 실습
- 로깅 샘플 코드 작성
- 필터와 동일한 기능을 하는 코드를 작성할 수 있음
- 다만 더 세밀한 조건식(include, execlude 등) 과 preHandle, postHandle, afterComplete를 통한 다양한 처리 가능
WebConfig
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean loggingFilter(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new LogFilter());
filterFilterRegistrationBean.setOrder(1);
filterFilterRegistrationBean.addUrlPatterns("/*");
return filterFilterRegistrationBean;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/*", "/images/*");
}
}