一、Filter過濾器
過濾器實際上就是對web資源進行攔截,做一些處理後再交給下一個過濾器或servlet處理。通常都是用來攔截request進行處理的,也可以對傳回的response進行攔截處理

二、應用場景
自動登入,統一設定編碼格式,通路權限控制,敏感字元過濾等
根據規範建議的各種類型的過濾器:
- 身份驗證過濾器(Authentication Filters)。
- 資料壓縮過濾器(Data compression Filters)。
- 加密過濾器(Encryption Filters)。
- 觸發資源通路事件過濾器。
- 圖像轉換過濾器(Image Conversion Filters)。
- 日志記錄和稽核過濾器(Logging and Auditing Filters)。
- MIME-TYPE 鍊過濾器(MIME-TYPE Chain Filters)。
- 标記化過濾器(Tokenizing Filters)。
- XSL/T 過濾器(XSL/T Filters),轉換 XML 内容。
過濾器通過 Web 部署描述符(web.xml)中的 XML 标簽來聲明,然後映射到您的應用程式的部署描述符中的 Servlet 名稱或 URL 模式。
當 Web 容器啟動 Web 應用程式時,它會為您在部署描述符中聲明的每一個過濾器建立一個執行個體。
Filter的執行順序與在web.xml配置檔案中的配置順序一緻,一般把Filter配置在所有的Servlet之前。
三、Filter過濾方法
過濾器是一個實作了 javax.servlet.Filter 接口的 Java 類。javax.servlet.Filter 接口定義了三個方法
1)public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
該方法完成實際的過濾操作,當用戶端請求方法與過濾器設定比對的URL時,Servlet容器将先調用過濾器的doFilter方法。
FilterChain使用者通路後續過濾器
2)public void init(FilterConfig fConfig)
web 應用程式啟動時,web 伺服器将建立Filter 的執行個體對象,并調用其init方法,讀取web.xml配置,完成對象的初始化功能。
進而為後續的使用者請求作好攔截的準備工作(filter對象隻會建立一次,init方法也隻會執行一次)。
開發人員通過init方法的參數,可獲得代表目前filter配置資訊的FilterConfig對象。
3)public void destroy()
Servlet容器在銷毀過濾器執行個體前調用該方法,在該方法中釋放Servlet過濾器占用的資源。
四、多個Filter的執行順序
在我們的請求到達Servle之間是可以經過多個Filter的,一般來說,建議Filter之間不要有關聯,各自處理各自的邏輯即可。這樣,我們也無需關心執行順序問題。
如果一定要確定執行順序,就要對配置進行修改了,執行順序如下:
① 在web.xml中,filter執行順序跟<filter-mapping>的順序有關,先聲明的先執行
② 使用注解配置的話,filter的執行順序跟名稱的字母順序有關,例如AFilter會比BFilter先執行
③ 如果既有在web.xml中聲明的Filter,也有通過注解配置的Filter,那麼會優先執行web.xml中配置的Filter
五、web.xml配置各節點說明
1)<filter>:指定一個過濾器
- <filter-name>:用于為過濾器指定一個名字,該元素的内容不能為空。
- <filter-class>:元素用于指定過濾器的完整的限定類名。
- <init-param>:元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。
在過濾器中,可以使用 FilterConfig 接口對象來通路初始化參數。
2)<filter-mapping>:用于設定一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源通路的請求路徑
- <filter-name>:子元素用于設定filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
- <url-pattern>:設定 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
3)<servlet-name>:指定過濾器所攔截的Servlet名稱。
4)<dispatcher>:指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,預設REQUEST。
使用者可以設定多個 <dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。
5)<dispatcher>子元素:可以設定的值及其意義
- REQUEST:當使用者直接通路頁面時,Web容器将會調用過濾器。如果目标資源是通過RequestDispatcher的include()或forward()方法通路時,那麼該過濾器就不會被調用。
- INCLUDE:如果目标資源是通過RequestDispatcher的include()方法通路時,那麼該過濾器将被調用。除此之外,該過濾器不會被調用。
- FORWARD:如果目标資源是通過RequestDispatcher的forward()方法通路時,那麼該過濾器将被調用,除此之外,該過濾器不會被調用。
- ERROR:如果目标資源是通過聲明式異常處理機制調用時,那麼該過濾器将被調用。除此之外,過濾器不會被調用。
六、XMl代碼展示
<!-- 注冊過濾器 -->
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>com.sikiedu.filter.EncodeFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.sikiedu.filter.AdminFilter</filter-class>
</filter>
<!-- //注冊過濾器 -->
<!-- 啟動過濾器 -->
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<!-- //啟動過濾器 -->