




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、JavaWEBJavaWEB開發(fā)開發(fā)-Servlet-Servlet過濾器過濾器Filter(過濾器)簡介Filter 的基本功能是對對 Servlet Servlet 容器調(diào)用容器調(diào)用 Servlet Servlet 的過的過程進(jìn)行攔截程進(jìn)行攔截,從而在從而在 Servlet Servlet 進(jìn)行響應(yīng)處理的前后實(shí)進(jìn)行響應(yīng)處理的前后實(shí)現(xiàn)一些特殊的功能現(xiàn)一些特殊的功能。在 Servlet API 中定義了三個(gè)接口類來開供開發(fā)人員編寫 Filter 程序:Filter, FilterChain, FilterConfigFilter Filter 程序是一個(gè)實(shí)現(xiàn)了程序是一個(gè)實(shí)現(xiàn)了 Filter F
2、ilter 接口的接口的 Java Java 類類,與 Servlet 程序相似,它由它由 Servlet Servlet 容器進(jìn)行調(diào)用和執(zhí)行容器進(jìn)行調(diào)用和執(zhí)行Filter Filter 程序需要在程序需要在 web.xml web.xml 文件中進(jìn)行注冊和設(shè)置它文件中進(jìn)行注冊和設(shè)置它所能攔截的資源所能攔截的資源:Filter 程序可以攔截 Jsp, Servlet, 靜態(tài)圖片文件和靜態(tài) html 文件Filter 的過濾過程Filter 的基本工作原理當(dāng)在 web.xml 中注冊了一個(gè) Filter 來對某個(gè) Servlet 程序進(jìn)行攔截處理時(shí),這個(gè) Filter 就成了 Servlet 容
3、器與該 Servlet 程序的通信線路上的一道關(guān)卡,該 Filter Filter 可以對可以對 Servlet Servlet 容器發(fā)送給容器發(fā)送給 Servlet Servlet 程序的請求和程序的請求和 Servlet Servlet 程序回送給程序回送給 Servlet Servlet 容器的相應(yīng)進(jìn)行攔截,容器的相應(yīng)進(jìn)行攔截,可以決定是否將請求繼續(xù)傳遞給可以決定是否將請求繼續(xù)傳遞給 Servlet Servlet 程序,以及對請求和相應(yīng)程序,以及對請求和相應(yīng)信息是否進(jìn)行修改信息是否進(jìn)行修改在一個(gè) web 應(yīng)用程序中可以注冊多個(gè) Filter 程序,每個(gè) Filter 程序都可以對一個(gè)或
4、一組 Servlet 程序進(jìn)行攔截。若有多個(gè) Filter 程序?qū)δ硞€(gè) Servlet 程序的訪問過程進(jìn)行攔截,當(dāng)針對該 Servlet 的訪問請求到達(dá)時(shí),web 容器將把這多個(gè) Filter 程序組合成一個(gè) Filter Filter 鏈鏈(過濾器鏈)。Filter Filter 鏈中各個(gè)鏈中各個(gè) Filter Filter 的攔截的攔截順序與它們在應(yīng)用程序的順序與它們在應(yīng)用程序的 web.xml web.xml 中中映射映射的順序一致的順序一致Filter 接口init(FilterConfig filterConfig)throws ServletException:在 web 應(yīng)用程序
5、啟動(dòng)時(shí),web 服務(wù)器將根據(jù) web.xml 文件中的配置信息來創(chuàng)建每個(gè)注冊的 Filter 實(shí)例對象,并將其保存在服務(wù)器的內(nèi)存中。WebWeb容器創(chuàng)建容器創(chuàng)建 Filter Filter 對象實(shí)例后,將立即調(diào)用該對象實(shí)例后,將立即調(diào)用該 Filter Filter 對象對象的的 init init 方法方法。Init Init 方法在方法在 Filter Filter 生命周期中僅執(zhí)行一次生命周期中僅執(zhí)行一次,web web 容容器在調(diào)用器在調(diào)用 init init 方法時(shí),會傳遞一個(gè)包含方法時(shí),會傳遞一個(gè)包含 Filter Filter 的配置和運(yùn)行環(huán)境的配置和運(yùn)行環(huán)境的的 FilterC
6、onfig FilterConfig 對象對象(FilterConfig的用法和ServletConfig類似)。利用FilterConfig對象可以得到ServletContext對象,以及部署描述符中配置的過濾器的初始化參數(shù)。在這個(gè)方法中,可以拋出ServletException異常,通知容器該過濾器不能正常工作。destroy():在Web容器卸載 Filter 對象之前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個(gè)方法中,可以釋放過濾器使用的資源。與開發(fā)Servlet不同的是,F(xiàn)ilter接口并沒有相應(yīng)的實(shí)現(xiàn)類可供繼承,要開發(fā)過濾器,只能直接實(shí)現(xiàn)Filter接口。Filte
7、r 接口doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws java.io.IOException,ServletException: doFilter()方法類似于Servlet接口的service()方法。當(dāng)客戶端請求當(dāng)客戶端請求目標(biāo)資源的時(shí)候,容器就會調(diào)用與這個(gè)目標(biāo)資源相關(guān)聯(lián)的過濾器目標(biāo)資源的時(shí)候,容器就會調(diào)用與這個(gè)目標(biāo)資源相關(guān)聯(lián)的過濾器的的doFilter()doFilter()方法方法。其中參數(shù) request, response 為 web 容器或 Filter 鏈的上
8、一個(gè) Filter 傳遞過來的請求和相應(yīng)對象;參數(shù)參數(shù) chain chain 為代表當(dāng)前為代表當(dāng)前 Filter Filter 鏈的對象,在特定的操作完成后鏈的對象,在特定的操作完成后,可以,可以在當(dāng)前在當(dāng)前 Filter Filter 對象的對象的 doFilter doFilter 方法內(nèi)部需要調(diào)用方法內(nèi)部需要調(diào)用 FilterChain FilterChain 對象的對象的 chain.doFilter(request,response)chain.doFilter(request,response)方法才能把請求交付給方法才能把請求交付給 Filter Filter 鏈中的下一個(gè)鏈中
9、的下一個(gè) Filter Filter 或者目標(biāo)或者目標(biāo) Servlet Servlet 程序去處理,程序去處理,也可以直接向客戶端返回響應(yīng)信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法將請求轉(zhuǎn)向到其他資源。這個(gè)方法的請求和響應(yīng)參數(shù)的類型是ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協(xié)議。FilterChain接口:FilterChain接口:代表當(dāng)前代表當(dāng)前 Filter Filter 鏈的對象鏈的對象。由容器實(shí)現(xiàn),
10、容器將其實(shí)例作為參數(shù)傳入過濾器對象的doFilter()方法中。過濾器對象使用過濾器對象使用FilterChainFilterChain對象對象調(diào)用過濾器鏈中的下一個(gè)過濾器調(diào)用過濾器鏈中的下一個(gè)過濾器,如果該過濾器是鏈中最后一個(gè)過濾器,那么將調(diào)用目標(biāo)資源。:調(diào)用該方法將使過濾器鏈中的下一個(gè)過濾器被調(diào)用。如果是最后一個(gè)過濾器,會調(diào)用目標(biāo)資源。FilterConfig接口接口:該接口類似于ServletConfig接口,由容器實(shí)現(xiàn)。ServletServlet規(guī)范將代表規(guī)范將代表 ServletContext ServletContext 對象和對象和 Filter Filter 的配置的配置參數(shù)
11、信息都封裝在該對象中。參數(shù)信息都封裝在該對象中。Servlet 容器將其作為參數(shù)傳入過濾器對象的init()方法中。String getFilterName():得到描述符中指定的過濾器的名字。String getInitParameter(String name): 返回在部署描述中指定的名字為name的初始化參數(shù)的值。如果不存在返回null. Enumeration getInitParameterNames():返回過濾器的所有初始化參數(shù)的名字的枚舉集合。public ServletContext getServletContext():返回Servlet上下文對象的引用。過濾器的部署在
12、實(shí)現(xiàn)一個(gè)過濾器后,需要在 web.xml 中進(jìn)行注冊和設(shè)置它所能攔截的資源。這可以通過和元素來完成的。 元素(注冊Filter)元素用于在Web應(yīng)用程序中注冊一個(gè)過濾器。在元素內(nèi)用于為過濾器指定一個(gè)名字,該元素的內(nèi)容不能為空。元素用于指定過濾器的完整的限定類名。元素用于為過濾器指定初始化參數(shù),它的子元素指定參數(shù)的名字,指定參數(shù)的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數(shù)。 元素(注冊Filter) testFitler org.test.TestFiter word_file /WEB-INF/word.txt lServlet容器對部署描述符中聲明的每一個(gè)過濾器
13、,只創(chuàng)建一個(gè)實(shí)例。與Servlet類似,容器將在同一個(gè)過濾器實(shí)例上運(yùn)行多個(gè)線程來同時(shí)為多個(gè)請求服務(wù),因此,開發(fā)過濾器時(shí),也要注意線程安全的問題。映射 Filter元素用于設(shè)置一個(gè) Filter 所負(fù)責(zé)攔截的資源。一個(gè)Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑( url樣式)子元素用于設(shè)置filter的注冊名稱。該值必須是在元素中聲明過的過濾器的名字設(shè)置 filter 所攔截的請求路徑(過濾器關(guān)聯(lián)的URL樣式)指定過濾器所攔截的Servlet名稱。指定過濾器所攔截的資源被指定過濾器所攔截的資源被 Servlet Servlet 容器容器調(diào)用的方式調(diào)用的方
14、式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST. 可以設(shè)置多個(gè)可以設(shè)置多個(gè) 子元素用來指定子元素用來指定 Filter Filter 對資源的多種調(diào)對資源的多種調(diào)用方式進(jìn)行攔截用方式進(jìn)行攔截映射 Filter 子元素可以設(shè)置的值及其意義:REQUESTREQUEST:當(dāng)用戶直接訪問頁面時(shí),Web容器將會調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法訪問時(shí),那么該過濾器就不會被調(diào)用。INCLUDE:如果目標(biāo)資源是通過RequestDispatcher的include()方法訪問時(shí),那么該過
15、濾器將被調(diào)用。除此之外,該過濾器不會被調(diào)用。FORWARDFORWARD:如果目標(biāo)資源是通過RequestDispatcher的forward()方法訪問時(shí),那么該過濾器將被調(diào)用,除此之外,該過濾器不會被調(diào)用。ERROR:如果目標(biāo)資源是通過聲明式異常處理機(jī)制調(diào)用時(shí),那么該過濾器將被調(diào)用。除此之外,過濾器不會被調(diào)用。映射 Filter testFilter testFilter /index.jsp /index.jsp REQUEST REQUEST FORWARD FORWARD testFilter /test.jsp映射 Filter在同一個(gè) web.xml 文件中可以為同一個(gè) Filt
16、er 設(shè)置多個(gè)映射。若一個(gè) Filter 鏈中多次出現(xiàn)了同一個(gè) Filter 程序,這個(gè) Filter 程序的攔截處理過程將被多次執(zhí)行典型應(yīng)用1:使瀏覽器不緩存頁面的過濾器:有 3 個(gè) HTTP 響應(yīng)頭字段都可以禁止瀏覽器緩存當(dāng)前頁面,它們在 Servlet 中的示例代碼如下:response.setDateHeader(Expires,-1);response.setDateHeader(Expires,-1);response.setHeader(Cache-Control,no-cache);response.setHeader(Cache-Control,no-cache);respo
17、nse.setHeader(Pragma,no-cache);response.setHeader(Pragma,no-cache);并不是所有的瀏覽器都能完全支持上面的三個(gè)響應(yīng)頭,因此最好是同時(shí)使用上面的三個(gè)響應(yīng)頭典型應(yīng)用2:字符編碼的過濾器通過配置參數(shù)encoding指明使用何種字符編碼,以處理Html Form請求參數(shù)的中文問題典型應(yīng)用3:檢測用戶是否登陸的過濾器:情景:系統(tǒng)中的某些頁面只有在正常登陸后才可以使用,用戶請求這些頁面時(shí)要檢查 session 中有無該用戶信息,但在所有必要的頁面加上session的判斷相當(dāng)麻煩的事情解決方案:編寫一個(gè)用于檢測用戶是否登陸的過濾器,如果用戶未登
18、錄,則重定向到指的登錄頁面要求:需檢查的在 Session 中保存的關(guān)鍵字; 如果用戶未登錄,需重定向到指定的頁面(URL不包括 ContextPath); 不做檢查的URL列表(以分號分開,并且 URL 中不包括 ContextPath)都要采取可配置的方式典型應(yīng)用4:利用Filter限制用戶瀏覽權(quán)限 裝飾 HttpServletRequest 對象 需求:在 HttpServletRequest 對象到達(dá) Servlet 之前把用戶輸入的多余空格都去掉情景:因?yàn)?HttpServletRequest 對象里的請求參數(shù)都實(shí)際包含在 java.util.Map 對象里,而Map是不允許修改的,
19、所以包含在 HttpServletRequest 對象里的請求參數(shù)不能被修改解決方案:采取 Decorator(裝飾器)模式Decorator 模式因?yàn)槔^承的關(guān)系,當(dāng)需要改變某個(gè)對象的行為時(shí),只須擴(kuò)展這個(gè)對象所屬的類并重寫其有關(guān)的方法就可以達(dá)到目的。但是,當(dāng)想要改變其行為的對象是由應(yīng)用當(dāng)想要改變其行為的對象是由應(yīng)用程序里的另一個(gè)子系統(tǒng)程序里的另一個(gè)子系統(tǒng)( (例如:一個(gè)對象工廠或是一個(gè)例如:一個(gè)對象工廠或是一個(gè)Servlet Servlet 容器容器) )負(fù)責(zé)構(gòu)造,繼承機(jī)制將無能為力負(fù)責(zé)構(gòu)造,繼承機(jī)制將無能為力Decorator 模式-情景已知:Messager 類的定義(可以從它派生處一個(gè)之
20、類);Messager 對象總是來自一個(gè)對象工廠(MessagerFactory),該工廠可以對它創(chuàng)建的每一個(gè) Messager 對象進(jìn)行初始化-通過調(diào)用 getMessage() 方法而獲得的 message 屬性也不例外(即不能對 Messager 對象進(jìn)行初始化)假設(shè):需要使用 Messager 類的 getMessage() 方法。有一個(gè)Util的使用工具類,該類中有如下方法: public static void broadcast(Message messager)public static void broadcast(Message messager) System.out.p
21、rintln(messager.getMessage(); System.out.println(messager.getMessage(); Decorator 模式-需求,方案需求:讓 broadcast 方法打印的字母都是大寫字母方案:從 Messager 類派生一個(gè)子類,把子類對象傳遞給 broadcast 方法。因?yàn)橹挥袑ο蠊S知道如何初始化 Messager 對象,所以該方案無意義Decorator 模式:從 Messager 類派生一個(gè)子類 MessagerDecorator,把子類對象傳遞給 broadcast 方法在 MessagerDecorator 類里實(shí)現(xiàn)構(gòu)造器:接受一個(gè) Messager 對象作為輸入?yún)?shù),而這個(gè) Messager 就是想要裝飾的對象:public
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五人投資合同范本
- 加盟裝修公司合同范本
- 化工煤炭采購合同范本
- 關(guān)鍵崗位用工合同范本
- 產(chǎn)權(quán)車位交易合同范本
- 乙方專利合同范本
- 企標(biāo)編制合同范本
- 業(yè)主施工安全合同范例
- 代加工木門合同范本
- 2024-2025學(xué)年高中數(shù)學(xué)選擇性必修第二冊湘教版(2019)教學(xué)設(shè)計(jì)合集
- 振華科技:振華集團(tuán)深圳電子有限公司擬吸收合并所涉及的其股東全部權(quán)益價(jià)值資產(chǎn)評估報(bào)告
- 第12課 Python的函數(shù) 教案
- 2024至2030年埃塞俄比亞投資環(huán)境現(xiàn)狀分析及投資風(fēng)險(xiǎn)預(yù)測報(bào)告
- 七年級下冊數(shù)學(xué)課件:平行線中的拐點(diǎn)問題
- 《現(xiàn)代企業(yè)管理》自考復(fù)習(xí)試題庫(含答案)
- DB15-T 3585-2024 高標(biāo)準(zhǔn)農(nóng)田施工質(zhì)量評定規(guī)程
- DG-TJ 08-2409-2022 老舊住宅小區(qū)消防改造技術(shù)標(biāo)準(zhǔn)
- 教師資格考試高級中學(xué)思想政治學(xué)科知識與教學(xué)能力2025年上半年測試試卷與參考答案
- 08SS704 混凝土模塊式化糞池
- 皮內(nèi)注射并發(fā)癥的預(yù)防及處理
評論
0/150
提交評論