資源描述:
《java_filter過濾機制詳解》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、JavaFilter過濾機制詳解以前以為Filter只是一個特殊點的Servlet,用進只需在web.xml中配置一下攔截路徑就可以了,可經過這兩天的深入學習,才知道以前對Filter類的了解和使用都太過淺薄了。在網上看了很多篇相關的技術文章,現提取它們中的精髓(我認為能說明問題的東西)及我個人的一些學習經驗作如下總結,希望能幫助大家更好地理解Filter的過濾機制。要學習Filter,就必須先理解和掌握servlet的調用機制和流程。關于servlet,網上也有很多相關文章,大家若有不明白的可以到百
2、度中搜一下,我這里為了突出重點就不多說了。好,下面進入正題。一、什么是Filter???????????Filter技術是servlet2.3新增加的功能.servlet2.3是sun公司與2000年10月發(fā)布的,它的開發(fā)者包括許多個人和公司團體,充分體現了sun公司所倡導的代碼開放性原則.由于眾多的參與者的共同努力,servlet2.3比以往功能都強大了許多,而且性能也有了大幅提高. 它新增加的功能包括: 1.應用程序生命周期事件控制; 2.新的國際化; 3.澄清了類的裝載規(guī)則; 4.新的
3、錯誤及安全屬性; 5.不贊成使用HttpUtils類; 6.各種有用的方法; 7.闡明并擴展了幾個servletDTD; 8.filter功能. 其中最重要的就是filter功能.它使用戶可以改變一個request和修改一個response.Filter不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在離開servlet時處理response.換種說法,filter其實是一個”servletchaining”
4、(servlet鏈).一個filter包括: 1.在servlet被調用之前截獲; 2.在servlet被調用之前檢查servletrequest; 3.根據需要修改request頭和request數據; 4.根據需要修改response頭和response數據; 5.在servlet被調用之后截獲.???????你能夠配置一個filter到一個或多個servlet;單個servlet或servlet組能夠被多個filter使用.幾個實用的filter包括:用戶辨認filter,日志filt
5、er,審核filter,加密filter,符號filter,能改變xml內容的XSLTfilter等.??????一個filter必須實現javax.servlet.Filter接口定義的三個方法:doFilter、init和destroy。(在三個方法在后面后有詳細的介紹).二、Filter體系結構???????2.1、Filter工作原理(執(zhí)行流程)????????????當客戶端發(fā)出Web資源的請求時,Web服務器根據應用程序配置文件設置的過濾規(guī)則進行檢查,若客戶請求滿足過濾規(guī)則,則對客戶請求/
6、響應進行攔截,對請求頭和請求數據進行檢查或改動,并依次通過過濾器鏈,最后把請求/響應交給請求的Web資源處理。請求信息在過濾器鏈中可以被修改,也可以根據條件讓請求不發(fā)往資源處理器,并直接向客戶機發(fā)回一個響應。當資源處理器完成了對資源的處理后,響應信息將逐級逆向返回。同樣在這個過程中,用戶可以修改響應信息,從而完成一定的任務。******************************************************************************************
7、******************************??????????在這里,我要插幾句——關于過濾鏈的問題:上面說了,當一個請求符合某個過濾器的過濾條件時該請求就會交給這個過濾器去處理。那么當兩個過濾器同時過濾一個請求時誰先誰后呢?這就涉及到了過濾鏈FilterChain。????????所有的奧秘都在Filter的FilterChain中。服務器會按照web.xml中過濾器定義的先后循序組裝成一條鏈,然后一次執(zhí)行其中的doFilter()方法。(注:這一點Filter和Servlet是不
8、一樣的,具體請參看我的另一篇文章:Servlet和Filter映射匹配原則之異同)執(zhí)行的順序就如下圖所示,執(zhí)行第一個過濾器的chain.doFilter()之前的代碼,第二個過濾器的chain.doFilter()之前的代碼,請求的資源,第二個過濾器的chain.doFilter()之后的代碼,第一個過濾器的chain.doFilter()之后的代碼,最后返回響應。???????????????這里還有一點想補充:大家有沒有想過,上面說的“執(zhí)行請求的資源