필터의 흐름은 다음과 같다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러
흐름에서 볼 수있듯이 필터는 http 요청을 받아서 컨트롤러에 가기전에 동작하고,
기능에 따라 컨트롤러에 접근하지 못하게 막아주는 역할을 하기도 한다.
필터는 서블릿에서 지원하여 Filter 인터페이스를 구현해서 등록한 뒤 사용해야한다.
# 필터의 3가지 메서드 init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출된다. doFilter(): 고객의 요청이 올 때 마다 해당 메서드가 호출된다. 필터의 로직을 구현하면 된다. destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다. |
@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, requestURI);
chain.doFilter(request, response);
} catch (Exception e) {
throw e;
} finally {
log.info("RESPONSE [{}][{}]", uuid, requestURI);
}
}
@Override
public void destroy() {
log.info("log filter destroy");
}
}
먼저 HTTP 요청이 오면 doFilter가 호출되고 doFilter에서 chain.doFilter(request, response)는 다음 필터가 있으면 호출하고, 없으면 서블릿을 종료하기 때문에 이 로직을 호출하지 않으면 다음 단계로 진행되지 않는다.!!
이후 스프링 빈을 등록하면 동작하게 된다.
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean logFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
'개발공부 > Spring' 카테고리의 다른 글
Spring :: 타입 컨버터 (0) | 2023.08.21 |
---|---|
스프링 인터셉터 (Interceptor) (0) | 2023.08.03 |
데이터 검증 (Validation) (0) | 2023.07.31 |
타임리프에서 스프링부트 메시지 사용하기 (0) | 2023.07.28 |
타임리프 기본 문법 정리 (form 태그) (0) | 2023.07.28 |