Filter
클라이언트가 서버로 요청을 하게되면 가장 먼저 Servlet Filter를 거치게 된다.
필터는 클라이언트와 어떤 URL에 해당하는 자원 사이에서 요청과 응답 정보를 이용해 다양한 처리를 함
Filter를 모두 거치고난 후 DispatcherServlet과 같은 Servlet에서 요청이 처리
Spring Security는 주요 보안에 대한 처리를 여러가지의 Filter로 처리하도록 구성
Filter Chain
Filter Chain 특징
Filter Chain 순서 관리
기타
클라이언트는 애플리케이션으로 요청을 전송하고, 컨테이너는 Servlet과 여러 Filter로 구성된 FilterChain을 만들어 요청 URI path 기반으로 HttpServletRequest를 처리
1개의 Servlet이 HttpServletRequest와 HttpServletResponse 처리를 담당
Filter method
구현 예시
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
System.out.println("FirstFilter 생성됨");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("First 필터 시작");
chain.doFilter(request, response);
System.out.println("First 필터 종료");
}
@Override
public void destroy() {
System.out.println("FirstFilter 사라짐");
Filter.super.destroy();
}
}
@Configuration
public class Config {
@Bean
public FilterRegistrationBean<FirstFilter> firstFilterRegister() {
FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>(new FirstFilter());
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean<SecondFilter> secondFilterRegister() {
FilterRegistrationBean<SecondFilter> registrationBean = new FilterRegistrationBean<>(new SecondFilter());
registrationBean.setOrder(2);
return registrationBean;
}
}
First 필터 시작
Second 필터 시작
Second 필터 종료
First 필터 종료
DelegatingFilterProxy
DelegatingFilterProxy 필요성
Servlet Filter는 스프링에서 정의 된 Bean을 주입해서 사용할 수 없음.
특정한 이름을 가진 스프링 빈을 찾아 그 빈에게 요청을 위임
FilterChainProxy
실행 과정