ServletFilter(過濾器)

分享

有用

返回

ServletFilter又稱Servlet過濾器,它是在Servlet2。3規範中定義的,能夠對Servlet容器傳給Web資源的request物件和response物件進行檢查和修改。

Filter不是Servlet,不能直接訪問,它本身也不能生成request物件和response物件,它只能為Web資源提供以下過濾功能:

在Web資源被訪問前,檢查request物件,修改請求頭和請求正文,或對請求進行預處理操作。

將請求傳遞到下一個過濾器或目標資源。

在Web資源被訪問後,檢查response物件,修改響應頭和響應正文。

注意:過濾器並不是必須要將請求傳遞到下一個過濾器或目標資源,它可以自行對請求進行處理,併發送響應給客戶端,也可以將請求轉發或重定向到其他的Web資源。

Filter是Servlet規範中最實用的技術,透過它可以對伺服器管理的所有Web資源(例如JSP、Servlet、靜態HTML檔案、靜態圖片等)進行攔截,從而實現一些特殊的功能,例如使用者的許可權控制、過濾敏感詞、設定統一編碼格式等。

Filter介面

與開發Servlet需要實現javax。servlet。Servlet介面類似,開發過濾器要實現javax。servlet。Filter介面,並提供一個公開的不帶參的構造方法。在Filter介面中,定義了3個方法,如下表所示。

返回值型別

方法

功能描述

void

init (FilterConfig filterConfig)

該方法用於初始化過濾器。

void

doFilter(ServletRequest request,SeivletResponse response, FilterChain chain)

該方法完成實際的過濾操作,當客戶端請求的 URL 與過濾器對映的 URL 匹配時,容器會先呼叫該方法對請求進行攔截。

引數 request 和 response 表示請求和響應物件。

引數 chain 代表當前 Filter 鏈物件,在該方法內部,呼叫 chain。doFilter() 方法,才能把請求交付給 Filter 鏈中的下一個 Filter 或者 Web 資源。

void

destroy()

該方法在銷燬 Filter 物件之前被呼叫,用於釋放被 Filter 物件佔用的資源。

Filter的工作流程

Filter的工作流程如下:

ServletFilter(過濾器)

1、客戶端請求訪問容器內的Web資源。

2、Servlet容器接收請求,並針對本次請求分別建立一個request物件和response物件。

3、請求到達Web資源之前,先呼叫Filter的doFilter()方法,檢查request物件,修改請求頭和請求正文,或對請求進行預處理操作。

4、在Filter的doFilter()方法內,呼叫FilterChain。doFilter()方法,將請求傳遞給下一個過濾器或目標資源。

5、目標資源生成響應資訊返回客戶端之前,處理控制權會再次回到Filter的doFilter()方法,執行FilterChain。doFilter()後的語句,檢查response物件,修改響應頭和響應正文。

6、響應資訊返回客戶端。

Filter的生命週期

Filter的生命週期分為3個階段:

1、初始化階段

2、攔截和過濾階段

3、銷燬階段

1.初始化階段

Servlet容器負責載入和例項化Filter。容器啟動時,讀取web。xml或@WebFilter的配置資訊對所有的過濾器進行載入和例項化。

載入和例項化完成後,Servlet容器呼叫init()方法初始化Filter例項。在Filter的生命週期內,init()方法只執行一次。

2.攔截和過濾階段

該階段是Filter生命週期中最重要的階段。當客戶端請求訪問Web資源時,Servlet容器會根據web。xml或@WebFilter的過濾規則進行檢查。當客戶端請求的URL與過濾器對映匹配時,容器將該請求的request物件、response物件以及FilterChain物件以引數的形式傳遞給Filter的doFilter()方法,並呼叫該方法對請求/響應進行攔截和過濾。

3.銷燬階段

Filter物件建立後會駐留在記憶體中,直到容器關閉或應用被移除時銷燬。銷燬Filter物件之前,容器會先呼叫destory()方法,釋放過濾器佔用的資源。在Filter的生命週期內,destory()只執行一次。

開課吧廣場-人才學習交流平臺

頂部