Filter의 정의

Servlet이 지원하는 기능으로, 공통적인 관심사를 가지고 있는 기능들이 실행되기 전 공통적으로 수행할 작업을 진행할 수 있음.


Filter의 인터페이스 형태

 public interface Filter {
     public default void init(FilterConfig filterConfig) throws ServletException {}
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
     
     public default void destroy() {}
}
  • init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출됩니다.
  • doFilter(): 고객의 요청이 올 때 마다 해당 메서드가 호출됩니다. 필터의 로직을 구현하면 됩니다.
  • destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출됩니다.

구현 예시

Filter 구현

@Slf4j  
public class LogFilter implements Filter {  
 
    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        log.info("log filter init");  
    }  
  
    @Override  
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;  
        String requestUri = httpRequest.getRequestURI();  
        String uuid = UUID.randomUUID().toString();  
  
        try {  
            log.info("REQUEST [{}][{}][{}]", uuid, requestUri, httpRequest.getRemoteAddr());  
            filterChain.doFilter(servletRequest, servletResponse);  
        } catch (Exception e) {  
            throw e;  
        } finally {  
            log.info("RESPONSE [{}][{}]", uuid, requestUri);  
        }  
    }  
  
    @Override  
    public void destroy() {  
        log.info("log filter destroy");  
    }  
}

filterChain.doFilter()

정상적으로 Filter 처리가 완료되면 마지막에 filterChain.doFilter함수를 호출합니다.
이는 해당 Filter가 끝나면 다른 Filter가 있다면 그 필터를 호출하고, 없으면 서블릿을 호출하도록 할 수 있기 때문에 꼭 넣어 줘야 합니다.

Bean에 등록

@Configuration  
public class WebConfig {  
  
    @Bean  
    public FilterRegistrationBean logFilter() {  
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();  
        filterRegistrationBean.setFilter(new LogFilter());  
        filterRegistrationBean.setOrder(1);  
        filterRegistrationBean.addUrlPatterns("/*");  
        return filterRegistrationBean;  
    }
}