[Spring] 스프링 MVC(16) - DelegatingFilterProxy
DelegatingFilterProxy를 이용한 서블릿 필터 등록
DelegatingFilterProxy 클래스는 서블릿 필터를 스프링 빈으로 등록할 때 사용된다. DelegatingFilterProxy 클래스는 스프링 컨테이너에 빈으로 등록된 서블릿 필터에 필터 처리를 위임한다. DelegatingFilterProxy를 사용하기 위해서는 다음과 같이 web.xml 파일에 DelegatingFilterProxy를 서블릿 필터로 등록해주면 된다.
<filter>
<filter-name>profileFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilter</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>webProfileBean</param-value>
</init-param>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>
org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher
</param-value>
</init-param>
</filter>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 이하 생략 -->
...
</servlet>
위 코드의 경우 profileFilter는 그 요청을 targetBeanName 초기화 파라미터로 지정한 빈에 위임한다. targetBeanName 초기화 파라미터를 지정하지 않으면, <filter-name> 태그에 지정한 이름을 빈 이름으로 사용한다.
DelegatingFilterProxy가 사용할 빈 객체는 다음의 두 가지 중 한 군데에 등록된다.
- DispatcherServlet이 생성한 WebApplicationContext
- ContextLoaderListener가 생성한 루트 WebApplicationContext
이 중, DispatcherServlet이 생성한 스프링 컨테이너에 필터로 사용할 빈 객체가 존재한다면, contextAttribute 초기화 파라미터를 이용해서 DispatcherServlet이 컨테이너를 보관할 때 사용하는 속성 이름을 지정해야 한다. 속성 이름은 "org.springframework.web.servlet.FrameworkServlet.CONTEXT.[서블릿이름]"의 형식을 갖는다.
contextAttribute 초기화 파라미터를 지정하지 않으면 루트 WebApplicationContext에 등록된 빈을 사용한다.
DelegatingFilterProxy는 기본적으로 Filter.init() 메서드와 Filter.destroy() 메서드에 대한 호출은 위임하지 않는데, 그 이유는 스프링 컨테이너가 라이프 사이클을 관리하기 때문이다. 만약 init() 메서드와 destroy() 메서드에 대해서도 위임을 하고 싶다면 다음과 같이 targetFilterLifecycle 초기화 파라미터 값을 true로 지정해주면 된다.
<filter>
<filter-name>profileFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilter</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>webProfileBean</param-value>
</init-param>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>
org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher
</param-value>
</init-param>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)