Servlet Filter
서블릿 기반 애플리케이션의 엔드 포인트에 요청이 도달하기 전, 중간에서 요청을 가로채 어떤 처리를 할 수 있도록 해주는 Java 컴포넌트
클라이언트가 서버 측 애플리케이션으로 요청 전송 시, 제일 먼저 Servlet Filter를 거침
Filter에서의 처리가 완료되면 DispatcherServlet에서 클라이언트 요청을 핸들러에 매핑하기 위한 다음 작업 진행
Spring Security는 주요 보안에 대한 처리를 여러가지의 Filter로 처리하도록 구성
FilterChain
Filter와 FilterChain의 특성
Filter 인터페이스
public class FirstFilter implements Filter {
@Override
// init(FilterConfig filterConfig)
// Filter를 웹 컨테이너 내 생성 후 초기화할 때 호출
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
System.out.println("FirstFilter 생성");
}
@Override
// doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
// Chain 을 따라 다음 Filter로 이동
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FirstFilter Start!");
chain.doFilter(request, response);
System.out.println("FirstFilter End!");
}
@Override
// destory()
// Filter 가 웹 컨테이너에서 삭제 시 호출
public void destroy() {
System.out.println("FirstFilter Gone!");
Filter.super.destroy();
}
}
---------------------------------
public class SecondFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
System.out.println("SecondFilter 생성");
}
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("SecondFilter Start!!");
chain.doFilter(request, response);
System.out.println("SecondFilter End!!");
}
@Override
public void destroy() {
System.out.println("SecondFilter Gone!!");
Filter.super.destroy();
}
@Configuration
public class Config {
@Bean
public FilterRegistrationBean<FirstFilter> firstFilterRegister() {
FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>(new FirstFilter());
registrationBean.setOrder(1); // 1번째로 실행하도록 지정
return registrationBean;
}
@Bean
public FilterRegistrationBean<SecondFilter> secondFilterRegister() {
FilterRegistrationBean<SecondFilter> registrationBean = new FilterRegistrationBean<>(new SecondFilter());
registrationBean.setOrder(2);
return registrationBean;
}
}
> 실행 결과
> FirstFilter Start!
> SecondFilter Start!!
> SecondFilter End!!
> FirstFilter End!