필터의 흐름은 다음과 같다.

 

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;
 	}
}

+ Recent posts