예외 처리에 따른 필터와 인터셉터 , 서블릿이 제공하는 DispatchType 이해하기
public enum DispatcherType{
FOWARD,
INCLUDE,
REQUEST,
ASYNC,
ERROR
}
REQUEST : 클라이언트 요청
ERROR : 오류 요청
FOWARD : MVC에서 배웠던 서블릿에서 다른 서블릿이나 JSP를 호출 할때 했었던
INCLUDE : 서블릿에서 다른 서블릿이나 JSP의 결과를 포함할때,
ASYNC : 서블릿 비동기 호출
필터를 만들어두고 webConfig를 통해서 필터를 등록해준다.
@Slf4j
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("log filter init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
String uuid = UUID.randomUUID().toString();
try {
log.info("REQUEST [{}][{}][{}]", uuid, request.getDispatcherType(),
requestURI);
chain.doFilter(request, response);
} catch (Exception e) {
throw e;
} finally {
log.info("RESPONSE [{}][{}][{}]", uuid, request.getDispatcherType(),
requestURI);
}
}
@Override
public void destroy() {
log.info("log filter destroy");
}
}
// webConfig를 만들고 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean logFilter(){
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.ERROR);
return filterRegistrationBean;
}
}
WebConfig에 addInterceptors 를 통해서 인터셉터를 추가
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/*.ico", "/error", "/error-page/**");
}