14.1. `DelegatingFilterProxy`

14.1. DelegatingFilterProxy

當使用 servlet filter 的時候,你必須在 web.xml 裡面做宣告,否則 filter 就會被 servlet 容器忽略。

在 Spring Security 裡面,filter 類別同時也是定義在 application context 的 Spring bean,因此能夠利用 Spring 的 DI 功能及生命週期介面的優勢,Spring 的 DelegatingFilterProxy 可以將 web.xml 連結到 application context。

當使用 DelegatingFilterProxy 的時候,你會在 web.xml 中看到類似這樣的東西:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注意宣告的 filter 其實是 DelegatingFilterProxy,而不是會實作 filter 邏輯的類別。

DelegatingFilterProxy 會透過一個從 Spring application context 取得的 bean 來代理 Filter 的方法,使得這個 bean 能利用 Spring 對 web application context lifecycle 的支援以及設定的彈性。

這個 bean 必須實作 javax.servlet.Filter 而且名稱必須與 filter-name 元素宣告的一樣。更多細節請參考 JavaDoc