天天看點

Servlet之過濾器總結--Filter

                          我們知道實際開發中我們可能有這種需要:對于某個網站來說需要限制一些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