Spring

[Spring] 스프링 MVC(16) - DelegatingFilterProxy

재담 2022. 4. 6. 23:26

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 프로그래밍 (최범균 저)