




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 JavaWEBJavaWEB開發(fā)開發(fā)-Servlet-Servlet過濾器過濾器佟剛佟剛 高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 Filter(過濾器)簡介lFilter 的基本功能是對對 Servlet 容器調(diào)用容器調(diào)用 Servlet 的過的過程進行攔截程進行攔截,從而在從而在 Servlet 進行響應(yīng)處理的前后實進行響應(yīng)處理的前后實現(xiàn)一些特殊的功能現(xiàn)一些特殊的功能。l在 Servlet API 中定義了三個接口類來開供開發(fā)人員編寫 Filter 程序:Filter, FilterCha
2、in, FilterConfiglFilter 程序是一個實現(xiàn)了程序是一個實現(xiàn)了 Filter 接口的接口的 Java 類類,與 Servlet 程序相似,它由它由 Servlet 容器進行調(diào)用和執(zhí)行容器進行調(diào)用和執(zhí)行l(wèi)Filter 程序需要在程序需要在 web.xml 文件中進行注冊和設(shè)置它文件中進行注冊和設(shè)置它所能攔截的資源所能攔截的資源:Filter 程序可以攔截 Jsp, Servlet, 靜態(tài)圖片文件和靜態(tài) html 文件高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 Filter 的過濾過程高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教
3、育 Filter 的基本工作原理l當(dāng)在 web.xml 中注冊了一個 Filter 來對某個 Servlet 程序進行攔截處理時,這個 Filter 就成了 Servlet 容器與該 Servlet 程序的通信線路上的一道關(guān)卡,該 Filter 可以對可以對 Servlet 容器發(fā)送給容器發(fā)送給 Servlet 程序的請求和程序的請求和 Servlet 程序回送給程序回送給 Servlet 容器的相應(yīng)進行攔截,容器的相應(yīng)進行攔截,可以決定是否將請求繼續(xù)傳遞給可以決定是否將請求繼續(xù)傳遞給 Servlet 程序,以及對請求和相程序,以及對請求和相應(yīng)信息是否進行修改應(yīng)信息是否進行修改l在一個 web
4、 應(yīng)用程序中可以注冊多個 Filter 程序,每個 Filter 程序都可以對一個或一組 Servlet 程序進行攔截。l若有多個 Filter 程序?qū)δ硞€ Servlet 程序的訪問過程進行攔截,當(dāng)針對該 Servlet 的訪問請求到達時,web 容器將把這多個 Filter 程序組合成一個 Filter 鏈鏈(過濾器鏈)。Filter 鏈中各個鏈中各個 Filter 的攔截的攔截順序與它們在應(yīng)用程序的順序與它們在應(yīng)用程序的 web.xml 中中映射映射的順序一致的順序一致高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 Filter 接口linit(FilterCon
5、fig filterConfig)throws ServletException:在 web 應(yīng)用程序啟動時,web 服務(wù)器將根據(jù) web.xml 文件中的配置信息來創(chuàng)建每個注冊的 Filter 實例對象,并將其保存在服務(wù)器的內(nèi)存中。Web容器創(chuàng)建容器創(chuàng)建 Filter 對象實例后,將立即調(diào)用該對象實例后,將立即調(diào)用該 Filter 對象的對象的 init 方法方法。Init 方法在方法在 Filter 生命周期中僅執(zhí)行一次生命周期中僅執(zhí)行一次,web 容器在調(diào)用容器在調(diào)用 init 方法時,會傳遞一個包含方法時,會傳遞一個包含 Filter 的配置和的配置和運行環(huán)境的運行環(huán)境的 Filter
6、Config 對象對象(FilterConfig的用法和ServletConfig類似)。利用FilterConfig對象可以得到ServletContext對象,以及部署描述符中配置的過濾器的初始化參數(shù)。在這個方法中,可以拋出ServletException異常,通知容器該過濾器不能正常工作。ldestroy():在Web容器卸載 Filter 對象之前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個方法中,可以釋放過濾器使用的資源。l與開發(fā)Servlet不同的是,F(xiàn)ilter接口并沒有相應(yīng)的實現(xiàn)類可供繼承,要開發(fā)過濾器,只能直接實現(xiàn)Filter接口。高級軟件人才實作培訓(xùn)專家高級軟
7、件人才實作培訓(xùn)專家! !北京傳智播客教育 Filter 接口ldoFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws java.io.IOException,ServletException: doFilter()方法類似于Servlet接口的service()方法。當(dāng)客戶端請求目當(dāng)客戶端請求目標(biāo)資源的時候,容器就會調(diào)用與這個目標(biāo)資源相關(guān)聯(lián)的過濾器的標(biāo)資源的時候,容器就會調(diào)用與這個目標(biāo)資源相關(guān)聯(lián)的過濾器的doFilter()方法方法。其中參數(shù) request, response 為 w
8、eb 容器或 Filter 鏈的上一個 Filter 傳遞過來的請求和相應(yīng)對象;參數(shù)參數(shù) chain 為代表為代表當(dāng)前當(dāng)前 Filter 鏈的對象,在特定的操作完成后鏈的對象,在特定的操作完成后,可以可以在當(dāng)前在當(dāng)前 Filter 對對象的象的 doFilter 方法內(nèi)部需要調(diào)用方法內(nèi)部需要調(diào)用 FilterChain 對象的對象的 chain.doFilter(request,response)方法才能把請求交付給方法才能把請求交付給 Filter 鏈中的下一個鏈中的下一個 Filter 或者目標(biāo)或者目標(biāo) Servlet 程序去處理,程序去處理,也可以直接向客戶端返回響應(yīng)信息,或者利用Req
9、uestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法將請求轉(zhuǎn)向到其他資源。這個方法的請求和響應(yīng)參數(shù)的類型是ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協(xié)議。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 FilterChain接口:lFilterChain接口:代表當(dāng)前代表當(dāng)前 Filter 鏈的對象鏈的對象。由容器實現(xiàn),容器將其實例作為參數(shù)傳入過濾器對象的doFilter()方法中。過濾器對象使用過濾器對象使用Fil
10、terChain對象對象調(diào)用過濾器鏈中的下一個過濾器調(diào)用過濾器鏈中的下一個過濾器,如果該過濾器是鏈中最后一個過濾器,那么將調(diào)用目標(biāo)資源。ldoFilter(ServletRequest request,ServletResponse response)throws java.io.IOException:調(diào)用該方法將使過濾器鏈中的下一個過濾器被調(diào)用。如果是最后一個過濾器,會調(diào)用目標(biāo)資源。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 FilterConfig接口ljavax.servlet.FilterConfig接口:該接口類似于ServletConfig接口,由容器
11、實現(xiàn)。Servlet規(guī)范將代表規(guī)范將代表 ServletContext 對象和對象和 Filter 的配置參數(shù)信息都封裝在的配置參數(shù)信息都封裝在該對象中。該對象中。Servlet 容器將其作為參數(shù)傳入過濾器對象的init()方法中。lString getFilterName():得到描述符中指定的過濾器的名字。lString getInitParameter(String name): 返回在部署描述中指定的名字為name的初始化參數(shù)的值。如果不存在返回null.l Enumeration getInitParameterNames():返回過濾器的所有初始化參數(shù)的名字的枚舉集合。lpubli
12、c ServletContext getServletContext():返回Servlet上下文對象的引用。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 過濾器的部署l在實現(xiàn)一個過濾器后,需要在 web.xml 中進行注冊和設(shè)置它所能攔截的資源。這可以通過和元素來完成的。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 元素(注冊Filter)l元素用于在Web應(yīng)用程序中注冊一個過濾器。l在元素內(nèi)用于為過濾器指定一個名字,該元素的內(nèi)容不能為空。元素用于指定過濾器的完整的限定類名。元素用于為過濾器指定初始化參數(shù),它的子元素指定參數(shù)的名字,指定參數(shù)
13、的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數(shù)。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 元素(注冊Filter) testFitler org.test.TestFiter word_file /WEB-INF/word.txt lServlet容器對部署描述符中聲明的每一個過濾器,只創(chuàng)建一個實例。與Servlet類似,容器將在同一個過濾器實例上運行多個線程來同時為多個請求服務(wù),因此,開發(fā)過濾器時,也要注意線程安全的問題。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 映射 Filterl元素用于設(shè)置一個 Fi
14、lter 所負(fù)責(zé)攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑( url樣式)子元素用于設(shè)置filter的注冊名稱。該值必須是在元素中聲明過的過濾器的名字設(shè)置 filter 所攔截的請求路徑(過濾器關(guān)聯(lián)的URL樣式)指定過濾器所攔截的Servlet名稱。指定過濾器所攔截的資源被指定過濾器所攔截的資源被 Servlet 容器容器調(diào)用的方式調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST. 可以設(shè)置多個可以設(shè)置多個 子元素用來指定子元素用來指定 Filter 對資源的多種調(diào)對資源的多種調(diào)用方式
15、進行攔截用方式進行攔截高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 映射 Filterl 子元素可以設(shè)置的值及其意義:REQUEST:當(dāng)用戶直接訪問頁面時,Web容器將會調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法訪問時,那么該過濾器就不會被調(diào)用。INCLUDE:如果目標(biāo)資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調(diào)用。除此之外,該過濾器不會被調(diào)用。FORWARD:如果目標(biāo)資源是通過RequestDispatcher的forward()方法訪問時,那么該過濾
16、器將被調(diào)用,除此之外,該過濾器不會被調(diào)用。ERROR:如果目標(biāo)資源是通過聲明式異常處理機制調(diào)用時,那么該過濾器將被調(diào)用。除此之外,過濾器不會被調(diào)用。高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 映射 Filter testFilter /index.jsp REQUEST FORWARD testFilter /test.jsp高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 映射 Filterl在同一個 web.xml 文件中可以為同一個 Filter 設(shè)置多個映射。若一個 Filter 鏈中多次出現(xiàn)了同一個 Filter 程序,這個 Filt
17、er 程序的攔截處理過程將被多次執(zhí)行高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 典型應(yīng)用1:l使瀏覽器不緩存頁面的過濾器:有 3 個 HTTP 響應(yīng)頭字段都可以禁止瀏覽器緩存當(dāng)前頁面,它們在 Servlet 中的示例代碼如下:response.setDateHeader(Expires,-1);response.setDateHeader(Expires,-1);response.setHeader(Cache-Control,no-cacheresponse.setHeader(Cache-Control,no-cache););response.setHeade
18、r(Pragma,noresponse.setHeader(Pragma,no-cache);-cache);并不是所有的瀏覽器都能完全支持上面的三個響應(yīng)頭,因此最好是同時使用上面的三個響應(yīng)頭高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 典型應(yīng)用2:l字符編碼的過濾器通過配置參數(shù)encoding指明使用何種字符編碼,以處理Html Form請求參數(shù)的中文問題高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 典型應(yīng)用3:l檢測用戶是否登陸的過濾器:情景:系統(tǒng)中的某些頁面只有在正常登陸后才可以使用,用戶請求這些頁面時要檢查 session 中有無該用
19、戶信息,但在所有必要的頁面加上session的判斷相當(dāng)麻煩的事情解決方案:編寫一個用于檢測用戶是否登陸的過濾器,如果用戶未登錄,則重定向到指的登錄頁面要求:需檢查的在 Session 中保存的關(guān)鍵字; 如果用戶未登錄,需重定向到指定的頁面(URL不包括 ContextPath); 不做檢查的URL列表(以分號分開,并且 URL 中不包括 ContextPath)都要采取可配置的方式高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 典型應(yīng)用4:l利用Filter限制用戶瀏覽權(quán)限 高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 裝飾 HttpServl
20、etRequest 對象 l需求:在 HttpServletRequest 對象到達 Servlet 之前把用戶輸入的多余空格都去掉l情景:因為 HttpServletRequest 對象里的請求參數(shù)都實際包含在 java.util.Map 對象里,而Map是不允許修改的,所以包含在 HttpServletRequest 對象里的請求參數(shù)不能被修改l解決方案:采取 Decorator(裝飾器)模式高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 Decorator 模式l因為繼承的關(guān)系,當(dāng)需要改變某個對象的行為時,只須擴展這個對象所屬的類并重寫其有關(guān)的方法就可以達到目的。
21、但是,當(dāng)想要改變其行為的對象是由應(yīng)用當(dāng)想要改變其行為的對象是由應(yīng)用程序里的另一個子系統(tǒng)程序里的另一個子系統(tǒng)(例如:一個對象工廠或是一個例如:一個對象工廠或是一個Servlet 容器容器)負(fù)責(zé)構(gòu)造,繼承機制將無能為力負(fù)責(zé)構(gòu)造,繼承機制將無能為力高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 Decorator 模式-情景l(fā)已知:Messager 類的定義(可以從它派生處一個之類);Messager 對象總是來自一個對象工廠(MessagerFactory),該工廠可以對它創(chuàng)建的每一個 Messager 對象進行初始化-通過調(diào)用 getMessage() 方法而獲得的 me
22、ssage 屬性也不例外(即不能對 Messager 對象進行初始化)l假設(shè):需要使用 Messager 類的 getMessage() 方法。有一個Util的使用工具類,該類中有如下方法: public static void broadcast(Message messager) System.out.println(messager.getMessage(); 高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 Decorator 模式-需求,方案l需求:讓 broadcast 方法打印的字母都是大寫字母l方案:從 Messager 類派生一個子類,把子類對象傳遞給
23、broadcast 方法。因為只有對象工廠知道如何初始化 Messager 對象,所以該方案無意義lDecorator 模式:從 Messager 類派生一個子類 MessagerDecorator,把子類對象傳遞給 broadcast 方法在 MessagerDecorator 類里實現(xiàn)構(gòu)造器:接受一個 Messager 對象作為輸入?yún)?shù),而這個 Messager 就是想要裝飾的對象:public MessagerDecorator(Messager messager)重寫 getMessage 方法,讓重寫的方法用大寫字母來返回 message 屬性高級軟件人才實作培訓(xùn)專家高級軟件人才實作培訓(xùn)專家! !北京傳智播客教育 HttpS
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 老公坐牢協(xié)議書
- 炒貨機閑置轉(zhuǎn)讓協(xié)議書
- 租金分配協(xié)議書
- 財產(chǎn)質(zhì)押協(xié)議書
- 英皇文化協(xié)議書
- 股權(quán)待持協(xié)議書
- 北京市勞動合同協(xié)議書
- 退伙退股協(xié)議書
- 學(xué)校招廚師合同協(xié)議書
- 均質(zhì)機出售轉(zhuǎn)讓協(xié)議書
- 大學(xué)計算機應(yīng)用基礎(chǔ)測試
- 師帶徒培訓(xùn)目標(biāo)計劃措施
- 人工智能助力企業(yè)創(chuàng)新發(fā)展
- 派出所民警培訓(xùn)課件
- 期中詞性轉(zhuǎn)換專練 2023-2024學(xué)年牛津上海版(試用本)八年級英語下冊
- 室外埋地聚乙烯(PE)給水管道工程技術(shù)規(guī)程
- 醫(yī)院培訓(xùn)課件:《ERAS在胃腸外科的應(yīng)用》
- (新版)滑雪指導(dǎo)員技能理論考試復(fù)習(xí)題庫(含答案)
- 腦動脈供血不足的護理查房
- 民法典介紹:解讀中國民事法律體系的核心
- 解決多模穴流動不平衡問題之流道翻轉(zhuǎn)技術(shù)
評論
0/150
提交評論