我們知道實際開發中我們可能有這種需要:對于某個網站來說需要限制一些ip對該網站的訪
問。例如教育網站,通常我們隻能通路到它的首頁,至于教務管理的頁面,不在該教育網段範
圍的IP是不能通路到的。
另外,在實際的項目中我們可能涉及到字元的轉碼,如果在每個頁面都去設定轉碼會十分的
麻煩,這時就可以使用Filter來解決了。
Servlet過濾器Fileter是一個小型的web元件,它們通過攔截請求和響應,以便檢視、提取或
以某種方式操作用戶端和伺服器之間交換的資料,實作“過濾”的功能。Filter通常封裝了一些功
能的web元件,過濾器提供了一種面向對象的子產品化機制,将任務封裝到一個可插入的元件中,
Filter元件通過配置檔案來聲明,并動态的代理。
簡單來說Servlet的Filter是:
● 聲明式的:通過在web.xml配置檔案中聲明,允許添加、删除過濾器,而無需改動任何
應用程式代碼或jsp頁面。
● 靈活的:過濾器可用于用戶端的直接調用執行預處理和後期的處理工作,通過過濾鍊可
以實作一些靈活的功能。
● 可移植的:由于現今各個web容器都是以Servlet的規範進行設計的,是以Servlet過濾器
同樣是跨容器的。
● 可重用的:基于其可移植性和聲明式的配置方式,Filter是可重用的。
總的來說,Servlet的過濾器是通過一個配置檔案來靈活的聲明的子產品化可重用元件。
過濾器動态的截獲傳入的請求和傳出的響應,在不修改程式代碼的情況下,透明的添加或删除
他們。其獨立于任何平台和web容器。
如其名字所暗示的一樣,Servlet過濾器用于攔截傳入的請求和傳出的響應,并監視、修改
處理web工程中的資料流。過濾器是一個可插入的自由元件。
web資源可以不配置過濾器、也可以配置單個過濾器,也可以配置多個過濾器,形成一個
過濾器鍊。Filter接受使用者的請求,并決定将請求轉發給鍊中的下一個元件,或者終止請求
直接向用戶端傳回一個響應。如果請求被轉發了,它将被傳遞給鍊中的下一個過濾器(以
web.xml過濾器的配置順序為标準)。這個請求在通過過濾鍊并被伺服器處理之後,一個響應
将以相反的順序通過該鍊發送回去。這樣,請求和響應都得到了處理。
Filter可以應用在用戶端和Servlet之間、servlet和serlvet或jsp之間,以及jsp之間。并且
可以通過配置資訊,靈活的使用那個過濾器。
基于Filter體系結構的描述,我們可以看出Filter的工作原理,簡單的通過一幅流程圖加以
示範:
用戶端浏覽器在通路web伺服器的某個具體資源的時候,經過過濾器1中code1代碼塊的相
關處理之後,将request請求傳遞給過濾鍊中的下一個過濾器2,(過濾鍊的順序以配置檔案
中的順序為基準)過濾器2處理完之後,request就傳遞的Servlet完成相應的邏輯。
傳回響應的過程類似,隻是過濾鍊的順序相反,這裡就不多說了。
在具體去實作FIlter之前,先去看看Filter的源碼,簡單的看看實作Filter需要做的事,從
源碼中可以看出,要編寫一個過濾器必須實作Filter接口。實作其接口規定的方法。
★ 實作javax.servlet.Filter接口
★ 實作init方法,讀取過濾器的初始化參數
★ 實作doFilter方法,完成對請求或響應的過濾
★ 調用FilterChain接口對象的doFilter方法,向後續的過濾器傳遞請求或響應
一個簡單的字元編碼處理的過濾器實作:
這裡對于過濾器對請求和響應的具體"過濾"過程,筆者就不多提了。
Filter是一個可插入的web元件,必須在web.xml檔案中配置才有效,那麼Filter是如何
配置的呢?針對上述字元編碼的Filter,配置資訊如下:
url-pattern配置詳解
在web.xml檔案中,以下文法用于定義映射:
l 以”/’開頭和以”/*”結尾的是用來做路徑映射的。
l 以字首”*.”開頭的是用來做擴充映射的。
l “/” 是用來定義default servlet映射的。
l 剩下的都是用來定義詳細映射的。比如: /aa/bb/cc.action
是以,為什麼定義”/*.action”這樣一個看起來很正常的比對會錯?
因為這個比對即屬于路徑映射,也屬于擴充映射,導緻容器無法判斷。
接下來筆者将示範一個IP過濾器,過濾掉某個具體的ip,并将用戶端的通路記錄做
一個日志檔案記錄。實際的過程如下:
這裡筆者保留了字元處理的Filter,列印資訊,以便更好的了解過濾鍊的執行情況。
編寫IP過濾器:IPFilter
接下來進行配置:
接下來簡單的日志檔案操作:
ok,我們看看實際的運作效果吧!
日志文檔資訊記錄如下:
好了,對于Servlet過濾器的學習就到這個地方了,當然上述執行個體隻是Filter的簡單運用
十分的靈活與友善。
參考文檔:
http://www.ibm.com/developerworks/cn/java/j-pj2ee10/index.html
By Kiritor
2013 /06 /15