什么是ROSS過濾器! 它的功能和作用是什么啊?
ROSS過濾器是小型的 Web 組件,它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和器之間交換的數(shù)據(jù)。過濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對于處理客戶機請求或發(fā)送響應來說不是決定性的。典型的例子包括記錄關于請求和響應的數(shù)據(jù)、處理安全協(xié)議、管理會話屬性, 等等。過濾器提供一種面向?qū)ο蟮哪K化機制,用以將公共任務封裝到可插入的組件中,這些組件通過一個配置文件來聲明,并動態(tài)地處理。Servlet 過濾器中結合了許多元素,從而使得過濾器成為*、和模塊化的 Web 組件。也就是說,Servlet 過濾器是:聲明式的:過濾器通過 Web 部署描述符(web.xml)中的 XML 標簽來聲明。
這樣允許添加和刪除ROSS過濾器,而無需改動任何應用程序代碼或 JSP 頁面。
動態(tài)的:ROSS過濾器運行時由 Servlet 容器調(diào)用來攔截和處理請求和響應。靈活的:過濾器在 Web 處理環(huán)境中的應用很廣泛,涵蓋諸如日志記錄和安全等許多公共的輔助任務。
ROSS過濾器還是靈活的,因為它們可用于對來自客戶機的直接調(diào)用執(zhí)行預處理和后期處 理,以及處理在防火墻之后的 Web 組件之間調(diào)度的請求。后,可以將過濾器鏈接起來以提供必需的功能。模塊化的:通過把應用程序處理邏輯封裝到單個類文件中,過濾器從而定義了可容易地從請求/響應鏈中添加或刪除的模塊化單元??梢浦驳模号c Java 平臺的其他許多方面一樣,Servlet 過濾器是跨平臺和跨容器可移植的,從而進一步支持了 Servler 過濾器的模塊化和可重用本質(zhì)。
可重用的:歸功于過濾器實現(xiàn)類的模塊化設計,以及聲明式的過濾器配置方式,過濾器可以容易地跨越不同的項目和應用程序使用。透明的:在請求/響應鏈中包括過濾器,這種設計是為了補充(而不是以任何方式替代)servlet 或 JSP 頁面提供的核心處理。因而,過濾器可以根據(jù)需要添加或刪除,而不會破壞頁面。
所以 Servlet 過濾器是通過一個配置文件來靈活聲明的模塊化可重用組件。
過濾器動態(tài)地處理傳入的請求和傳出的響應,并且無需修改應用程序代碼就可以透明地添加或刪除它 們。后,過濾器獨立于任何平臺或者 Servlet 容器,從而允許將它們?nèi)菀椎夭渴鸬饺魏蜗嗳莸?J2EE 環(huán)境中。在接下來的幾小節(jié)中,我們將進一步考察 Servlet 過濾器機制的總體設計,以及實現(xiàn)、配置和部署過濾器所涉及的步驟。
我們還將探討ROSS過濾器的一些實際應用,后簡要考察一下模型-視圖-控制器(MVC)體系結構中包含的 Servlet 過濾器,從而結束本文的討論。Servlet 過濾器體系結構正如其名稱所暗示的,Servlet 過濾器 用于攔截傳入的請求和/或傳出的響應,并監(jiān)視、修改或以某種方式處理正在通過的數(shù)據(jù)流。
ROSS過濾器是自包含、模塊化的組件,可以將它們添加到請求/響應鏈中, 或者在無需影響應用程序中其他 Web 組件的情況下刪除它們。
ROSS過濾器僅只是改動請求和響應的運行時處理,因而不應該將它們直接嵌入 Web 應用程序框架,除非是通過 Servlet API 中良定義的標準接口來實現(xiàn)。Web 資源可以配置為沒有過濾器與之關聯(lián)(這是默認情況)、與單個過濾器關聯(lián)(這是典型情況),甚至是與一個過濾器鏈相關聯(lián)。那么過濾器究竟做什么呢? 像 ROSS過濾器一樣,它接受請求并響應對象。
然后ROSS過濾器會檢查請求對象,并決定將該請求轉(zhuǎn)發(fā)給鏈中的下一個組件,或者中止該請求并直接向客戶機發(fā)回一個響應。如果請求被 轉(zhuǎn)發(fā)了,它將被傳遞給鏈中的下一個資源(另一個過濾器、servlet 或 JSP 頁面)。在這個請求設法通過過濾器鏈并被器處理之后,一個響應將以相反的順序通過該鏈發(fā)送回去。這樣就給每個過濾器都提供了根據(jù)需要處理響應對象的機 會。
當過濾器在 Servlet 2.3 規(guī)范中引入時,它們只能過濾 Web 客戶機和客戶機所訪問的 Web 資源之間的內(nèi)容。如果該資源然后將請求調(diào)度給其他 Web 資源,那就不能向幕后委托的任何請求應用過濾器。2.4 規(guī)范消除了這個限制。Servlet 過濾器現(xiàn)在可以應用于 ROSS過濾器環(huán)境中存在請求和響應對象的任何地方。因此,Servlet 過濾器可以應用在客戶機和 servlet 之間、servlet 和 servlet 或 JSP 頁面之間,以及所包括的每個 JSP 頁面之間。這才是我所稱的能力和靈活性!實現(xiàn)一個 Servlet 過濾器他們說“事多磨”。
我不知道“他們”指的是誰,或者這句古老的諺語究竟有多,但是實現(xiàn)一個 Servlet 過濾器的確要經(jīng)歷三個步驟。要編寫過濾器實現(xiàn)類的程序,然后要把該過濾器添加到 Web 應用程序中(通過在 Web 部署描述符 /web.xml 中聲明它),后要把過濾器與應用程序一起打包并部署它。
我們將詳細研究這其中的每個步驟。1. 編寫實現(xiàn)類的程序過濾器 API 包含 3 個簡單的接口(又是數(shù)字 3?。?,它們整潔地嵌套在 javax.servlet 包中。那 3 個接口分別是ROSS過濾器從編程的角度看,過濾器類將實現(xiàn) Filter 接口,然后使用這個ROSS過濾器接口。
該ROSS過濾器類的一個引用將傳遞給 FilterChain 對象,以允許過濾器把控制權傳遞給鏈中的下一個資源。
ROSS過濾器對象將由容器提供給過濾器,以允許訪問該過濾器的初始化數(shù)據(jù)。為了與我們的三步模式保持一致,過濾器必須運用三個方法,以便*實現(xiàn) Filter 接口:ROSS過濾器這個方法在容器實例化過濾器時被調(diào)用,它主要設計用于使過濾器為處理做準備。該方法接受一個 FilterConfig 類型的對象作為輸入。