Filter是Servlet的過濾器,是Servlet 2.3規范中新增加的一個功能,主要用于完成一些通用的操作,如編碼的過濾、判斷用戶的登錄狀態等。
在現實生活中,人們可以使用污水凈化設備對水源進行過濾凈化。同樣,在程序中人們也可以使用 Filter 對請求和響應信息進行過濾。
Filter 被稱為過濾器,其主要作用是對 Servlet 容器調用 Servlet 的過程進行攔截,從而在 Servlet 進行響應處理的前后實現一些特殊功能。Filter 在 Web 應用中的攔截過程如圖 1 所示。
圖 1 Filter攔截過程
在圖 1 中,當用戶通過瀏覽器訪問服務器中的目標資源時,首先會被 Filter 攔截,在 Filter 中進行預處理操作,然后再將請求轉發給目標資源。當服務器接收到這個請求后會對其進行響應,在服務器處理響應的過程中,也需要將響應結果經過濾器處理后,才發送給客戶端。
本質上,Filter 過濾器就是一個實現了 javax.servlet.Filter 接口的類,在 javax.servlet.Filter 接口中定義了三個方法,如表 1 所示。
表 1 Filter 接口中的方法
方法聲明 |
功能描述 |
---|---|
init(FilterConfig filterConfig) |
方法用于初始化過濾器,開發人員可以在 init() 方法中完成與構造方法類似的初始化功能,如果初始化代碼中要使用到 FillerConfig 對象,那么,這些初始化代碼就只能在 Filler 的 init() 方法中編寫,而不能在構造方法中編寫 |
doFilter(ServletRequest request,SeivletResponse response, FilterChain chain) |
doFilter()方法有多個參數,其中,參數 request 和 response 為 Web 服務器或 Filter 鏈中的上一個 Filter 傳遞過來的請求和響應對象; 參數 chain 代表當前 Filter 鏈的對象,只有在當前 Filter 對象中的 doFilter() 方法內部需要調用 FilterChain 對象的 doFilter() 方法,才能把請求交付給 Filter 鏈中的下一個 Filter 或者目標程序處理 |
destroy() |
destroy()方法在 Web 服務器卸載 Filter 對象之前被調用,該方法用于釋放被 Filter 對象打開的資源,例如關閉數據庫和 I/O 流 |
表 1 中的三個方法都是可以表現 Filter 生命周期的方法,其中 init() 方法在 Web 應用程序加載時會被調用,destroy() 方法在 Web 應用程序卸載(或關閉)時被調用,這兩個方法都只會被調用一次,而 doFilter() 方法會被調用多次(只要客戶端有請求時就會被調用),Filter 所有的工作集中在 doFilter() 方法中。