1. 介紹
定義:過濾器是一個服務端的組件,它可以截取用戶端的請求與響應信息,並對這些信息過濾。
生命週期:
其中實例化是在Web項目啓動的時候執行,只會執行一次;初始化也只會執行一次;過濾會執行多次,每一次接受請求都會執行一次;銷燬是在Web容器關閉的時候執行。
2. 實現過濾器
過濾器實現了javax.servlet.Filter接口,需要我們實現3個方法:
init():這是過濾器的初始化方法,Web容器創建過濾器實例後將調用這個方法。這個方法中可以讀取web.xml文件中過濾器的參數。
doFilter():這個方法完成實際的過濾操作。這個地方是過濾器的核心方法。當用戶請求訪問與過濾器關聯的URL時,Web容器將先調用過濾器的doFilter方法。FilterChain參數可以調用chain.doFilter方法,將請求傳給下一個過濾器(或目標資源),或利用轉發、重定向將請求轉發到其它資源。
destroy():Web容器在銷燬過濾器實例前調用該方法,在這個方法中可以釋放過濾器佔用的資源。(大多數情況用不到)
web.xml配置:
<filter>標籤只能配置一個,而<filter-mapping>標籤可以配置多個。
一個簡單的Web.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.thr.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
</web-app>
過濾器可以改變用戶的請求的Web資源,也就是可以改變用戶請求的路徑。
過濾器不能直接返回數據,不能直接處理用戶請求。
3. 過濾器鏈
4. 過濾器分類
(1). REQUEST:用戶直接訪問頁面時,Web容器將會調用過濾器,如果沒有配置的話,默認的是REQUEST
(2). FORWARD:目標資源是通過RequestDIspatcher的forward訪問時,該過濾器將被調用。
(3). INCLUDE:目標資源是通過RequestDIspatcher的include訪問時,該過濾器將被調用。
(4). ERROR:目標資源是通過聲明式異常處理機制調用時,過濾器將被調用。
使用重定向並且REQUEST時,可能會產生死循環。
使用請求轉發並且FORWARD時,可能會產生死循環。
在Servlet3.0中新增了ASYNC:支持異步處理。
@WebFilter:用於將一個類聲明爲過濾器,該註解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署爲過濾器。
使用@WebFilter,可以不必在web.xml中配置即可完成對過濾器的配置。
@WebFilter的常用屬性:
可以在web.xml中配置FilterConfig的初始化參數,在過濾器裏可以通過getInitParameter獲取初始化參數。
5. 應用場景
(1). 對用戶請求進行統一認證
(2). 編碼轉換
(3). 對用戶發送的數據進行過濾替換
(4). 轉換圖像格式
(5). 對響應的內容進行壓縮
一個解決中文亂碼的思路:在過濾器中進行request.setCharacterEncoding("utf-8")設置。