Filter是Servlet的過濾器,是Servlet 2.3規(guī)范中新增加的一個功能,主要用于完成一些通用的操作,如編碼的過濾、判斷用戶的登錄狀態(tài)等。
在現(xiàn)實生活中,人們可以使用污水凈化設(shè)備對水源進(jìn)行過濾凈化。同樣,在程序中人們也可以使用 Filter 對請求和響應(yīng)信息進(jìn)行過濾。
Filter 被稱為過濾器,其主要作用是對 Servlet 容器調(diào)用 Servlet 的過程進(jìn)行攔截,從而在 Servlet 進(jìn)行響應(yīng)處理的前后實現(xiàn)一些特殊功能。Filter 在 Web 應(yīng)用中的攔截過程如圖 1 所示。

圖 1 Filter攔截過程
在圖 1 中,當(dāng)用戶通過瀏覽器訪問服務(wù)器中的目標(biāo)資源時,首先會被 Filter 攔截,在 Filter 中進(jìn)行預(yù)處理操作,然后再將請求轉(zhuǎn)發(fā)給目標(biāo)資源。當(dāng)服務(wù)器接收到這個請求后會對其進(jìn)行響應(yīng),在服務(wù)器處理響應(yīng)的過程中,也需要將響應(yīng)結(jié)果經(jīng)過濾器處理后,才發(fā)送給客戶端。
本質(zhì)上,F(xiàn)ilter 過濾器就是一個實現(xiàn)了 javax.servlet.Filter 接口的類,在 javax.servlet.Filter 接口中定義了三個方法,如表 1 所示。
表 1 Filter 接口中的方法
|
方法聲明 |
功能描述 |
|---|---|
|
init(FilterConfig filterConfig) |
方法用于初始化過濾器,開發(fā)人員可以在 init() 方法中完成與構(gòu)造方法類似的初始化功能,如果初始化代碼中要使用到 FillerConfig 對象,那么,這些初始化代碼就只能在 Filler 的 init() 方法中編寫,而不能在構(gòu)造方法中編寫 |
|
doFilter(ServletRequest request,SeivletResponse response, FilterChain chain) |
doFilter()方法有多個參數(shù),其中,參數(shù) request 和 response 為 Web 服務(wù)器或 Filter 鏈中的上一個 Filter 傳遞過來的請求和響應(yīng)對象; 參數(shù) chain 代表當(dāng)前 Filter 鏈的對象,只有在當(dāng)前 Filter 對象中的 doFilter() 方法內(nèi)部需要調(diào)用 FilterChain 對象的 doFilter() 方法,才能把請求交付給 Filter 鏈中的下一個 Filter 或者目標(biāo)程序處理 |
|
destroy() |
destroy()方法在 Web 服務(wù)器卸載 Filter 對象之前被調(diào)用,該方法用于釋放被 Filter 對象打開的資源,例如關(guān)閉數(shù)據(jù)庫和 I/O 流 |
表 1 中的三個方法都是可以表現(xiàn) Filter 生命周期的方法,其中 init() 方法在 Web 應(yīng)用程序加載時會被調(diào)用,destroy() 方法在 Web 應(yīng)用程序卸載(或關(guān)閉)時被調(diào)用,這兩個方法都只會被調(diào)用一次,而 doFilter() 方法會被調(diào)用多次(只要客戶端有請求時就會被調(diào)用),F(xiàn)ilter 所有的工作集中在 doFilter() 方法中。