Filter란?
•
HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 코드
•
서블릿 2.3 규약에 새롭게 추가되었다.
→ 필터는 객체의 형태로 존재하며 클라이언트로부터 오는 요청(request)과 최종자원(서블릿/JSP/기타 문서) 사이에 위치하며 클라이언트의 요청 정보를 알맞게 변경할 수 있으며, 또한 필터는 최종 자원과 클라이언트로 가는 응답(response) 사이에 위치하여 최종 자원의 요청 결과를 알맞게 변경할 수 있다.
•
Filter는 서블릿이 제공하는 기술이므로, 서블릿 컨테이너에 의해서 생성되고 관리된다
→ 스프링에서 Filter를 Bean으로 주입받을 수 없다.
→ DelegatingFilterProxy를 통해 스프링에서 Bean을 주입받을 수 있다.
DelegatingFilterProxy
•
서블릿 컨테이너에서 관리되는 프록시용 Filter로 우리가 만든 Filter를 갖고있다.
•
요청이 오면 DelegatingFilterProxy가 요청을 받아서 우리가 만든 Filter(스프링 빈)에게 요청을 위임한다
작동 순서
1.
Filter 구현체가 스프링 빈으로 등록
2.
ServletContext가 Filter 구현체를 갖는 DelegatingFilterProxy를 생성
3.
ServletContext가 DelegatingFilterProxy를 서블릿 컨테이너에 필터로 등록
4.
요청이 오면 DelegatingFilterProxy가 필터 구현체에게 요청을 위임하여 필터 처리를 진행
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws ServletException, IOException {
chain.doFilter(request, response);
}
@Override
public void init(final FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
Java
복사
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
// Spring에서는 addFilter를 통해 ServletContext에 필터를 등록
servletContext.addFilter("myFilter", DelegatingFilterProxy.class);
}
}
Java
복사
•
myFilter라는 빈을 찾아서 DelegatingFilterProxy에 넣어주고, 서블릿 컨테이너에 myFilter 대신 DelegatingFilterProxy를 등록하여 DelegatingFilterProxy를 통해 myFilter에 요청을 위임
→ DelegatingFilterProxy가 add되는 곳은 ServletContext
→ 우리가 만든 필터는 스프링 컨테이너에 빈으로 먼저 등록
→ DelegatingFilterProxy에 감싸져 서블릿 컨테이너로 등록
•
우리가 개발한 Filter도 스프링 빈으로 등록되며, 스프링 컨테이너에서 관리되기 때문에 빈 등록뿐만 아니라 빈의 주입까지 가능
SpringBoot에서의 Filter
•
SpringBoot가 내장 웹서버를 지원
→ 톰캣과 같은 서블릿 컨테이너까지 SpringBoot가 제어가능
→ ServletContext에 Filter Bean을 DelegatingFilterProxy로 감싸서 등록하지 않아도 된다.
•
SpringBoot가 서블릿 필터의 구현체 빈을 찾으면 DelegatingFilterProxy 없이 바로 필터 체인(Filter Chain)에 필터를 등록
한 줄 정리
스프링에서 Filter를 Bean으로 등록하기 위해서는 DelegatingFilterProxy를 이용해야한다.
Filter 구현체는 스프링 Bean으로 등록되고, ServletContext는 Filter 구현체를 갖는 DelegatingFilterProxy를 생성 후 서블릿 컨테이너에 필터로 등록한다. 요청이 들어오면 DelegatingFilterProxy가 요청을 받아 Filter에 요청을 위임한다.