《servlet過(guò)濾器》培訓(xùn)
《《servlet過(guò)濾器》培訓(xùn)》由會(huì)員分享,可在線閱讀,更多相關(guān)《《servlet過(guò)濾器》培訓(xùn)(28頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、JavaWEB開(kāi) 發(fā) -Servlet過(guò) 濾 器 Filter(過(guò)濾器)簡(jiǎn)介 Filter 的基本功能是對(duì) Servlet 容器調(diào)用 Servlet 的過(guò)程進(jìn)行攔截,從而在 Servlet 進(jìn)行響應(yīng)處理的前后實(shí)現(xiàn)一些特殊的功能。在 Servlet API 中定義了三個(gè)接口類(lèi)來(lái)開(kāi)供開(kāi)發(fā)人員編寫(xiě) Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一個(gè)實(shí)現(xiàn)了 Filter 接口的 Java 類(lèi),與 Servlet 程序相似,它由 Servlet 容器進(jìn)行調(diào)用和執(zhí)行 Filter 程序需要在 web.xml 文件中進(jìn)行注冊(cè)和設(shè)置它所能攔截的資源
2、:Filter 程序可以攔截 Jsp, Servlet, 靜態(tài)圖片文件和靜態(tài) html 文件 Filter 的過(guò)濾過(guò)程 Filter 的基本工作原理當(dāng)在 web.xml 中注冊(cè)了一個(gè) Filter 來(lái)對(duì)某個(gè) Servlet 程序進(jìn)行攔截處理時(shí),這個(gè) Filter 就成了 Servlet 容器與該 Servlet 程序的通信線路上的一道關(guān)卡,該 Filter 可以對(duì) Servlet 容器發(fā)送給 Servlet 程序的請(qǐng)求和 Servlet 程序回送給 Servlet 容器的相應(yīng)進(jìn)行攔截,可以決定是否將請(qǐng)求繼續(xù)傳遞給 Servlet 程序,以及對(duì)請(qǐng)求和相應(yīng)信息是否進(jìn)行修改在一個(gè) web 應(yīng)用程序中
3、可以注冊(cè)多個(gè) Filter 程序,每個(gè) Filter 程序都可以對(duì)一個(gè)或一組 Servlet 程序進(jìn)行攔截。若有多個(gè) Filter 程序?qū)δ硞€(gè) Servlet 程序的訪問(wèn)過(guò)程進(jìn)行攔截,當(dāng)針對(duì)該 Servlet 的訪問(wèn)請(qǐng)求到達(dá)時(shí),web 容器將把這多個(gè) Filter 程序組合成一個(gè) Filter 鏈(過(guò)濾器鏈)。Filter 鏈中各個(gè) Filter 的攔截順序與它們?cè)趹?yīng)用程序的 web.xml 中映射的順序一致 Filter 接口 init(FilterConfig filterConfig)throws ServletException:在 web 應(yīng)用程序啟動(dòng)時(shí),web 服務(wù)器將根據(jù) web
4、.xml 文件中的配置信息來(lái)創(chuàng)建每個(gè)注冊(cè)的 Filter 實(shí)例對(duì)象,并將其保存在服務(wù)器的內(nèi)存中。Web容器創(chuàng)建 Filter 對(duì)象實(shí)例后,將立即調(diào)用該 Filter 對(duì)象的 init 方法。Init 方法在 Filter 生命周期中僅執(zhí)行一次,web 容器在調(diào)用 init 方法時(shí),會(huì)傳遞一個(gè)包含 Filter 的配置和運(yùn)行環(huán)境的 FilterConfig 對(duì)象(FilterConfig的 用 法 和 ServletConfig類(lèi) 似 )。 利 用FilterConfig對(duì) 象 可 以 得 到 ServletContext對(duì) 象 , 以 及 部 署 描 述 符 中配 置 的 過(guò) 濾 器 的 初
5、始 化 參 數(shù) 。 在 這 個(gè) 方 法 中 , 可 以 拋 出ServletException異 常 , 通 知 容 器 該 過(guò) 濾 器 不 能 正 常 工 作 。 destroy():在Web容器卸載 Filter 對(duì)象之前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在 這 個(gè) 方 法 中 , 可 以 釋 放 過(guò) 濾 器 使 用的 資 源 。 與 開(kāi) 發(fā) Servlet不 同 的 是 , Filter接 口 并 沒(méi) 有 相 應(yīng) 的 實(shí) 現(xiàn) 類(lèi) 可 供 繼 承 ,要 開(kāi) 發(fā) 過(guò) 濾 器 , 只 能 直 接 實(shí) 現(xiàn) Filter接 口 。 Filter 接口 doFilter(Servl
6、etRequest request,ServletResponse response, FilterChain chain)throws java.io.IOException,ServletException: doFilter()方 法 類(lèi) 似 于 Servlet接 口 的 service()方 法 。 當(dāng) 客 戶(hù) 端 請(qǐng) 求 目標(biāo) 資 源 的 時(shí) 候 , 容 器 就 會(huì) 調(diào) 用 與 這 個(gè) 目 標(biāo) 資 源 相 關(guān) 聯(lián) 的 過(guò) 濾 器 的doFilter()方 法 。其中參數(shù) request, response 為 web 容器或 Filter 鏈的上一個(gè) Filter 傳遞過(guò)來(lái)的請(qǐng)求和相
7、應(yīng)對(duì)象;參數(shù) chain 為代表當(dāng)前 Filter 鏈的對(duì)象,在特定的操作完成后, 可 以在當(dāng)前 Filter 對(duì)象的 doFilter 方法內(nèi)部需要調(diào)用 FilterChain 對(duì)象的 chain.doFilter(request,response)方法才能把請(qǐng)求交付給 Filter 鏈中的下一個(gè) Filter 或者目標(biāo) Servlet 程序去處理,也 可 以 直 接 向 客戶(hù) 端 返 回 響 應(yīng) 信 息 , 或 者 利 用 RequestDispatcher的 forward()和include()方 法 , 以 及 HttpServletResponse的 sendRedirect()方
8、 法 將 請(qǐng) 求轉(zhuǎn) 向 到 其 他 資 源 。 這 個(gè) 方 法 的 請(qǐng) 求 和 響 應(yīng) 參 數(shù) 的 類(lèi) 型 是ServletRequest和 ServletResponse, 也 就 是 說(shuō) , 過(guò) 濾 器 的 使 用 并 不 依賴(lài) 于 具 體 的 協(xié) 議 。 FilterChain接口: FilterChain接口:代表當(dāng)前 Filter 鏈的對(duì)象。由容器實(shí)現(xiàn),容器將其實(shí)例作為參數(shù)傳入過(guò)濾器對(duì)象的doFilter()方法中。過(guò)濾器對(duì)象使用FilterChain對(duì)象調(diào)用過(guò)濾器鏈中的下一個(gè)過(guò)濾器,如果該過(guò)濾器是鏈中最后一個(gè)過(guò)濾器,那么將調(diào)用目標(biāo)資源。 doFilter(ServletReques
9、t request,ServletResponse response)throws java.io.IOException:調(diào)用該方法將使過(guò)濾器鏈中的下一個(gè)過(guò)濾器被調(diào)用。如果是最后一個(gè)過(guò)濾器,會(huì)調(diào)用目標(biāo)資源。 FilterConfig接口 javax.servlet.FilterConfig接口:該接口類(lèi)似于ServletConfig接口,由容器實(shí)現(xiàn)。Servlet規(guī)范將代表 ServletContext 對(duì)象和 Filter 的配置參數(shù)信息都封裝在該對(duì)象中。Servlet 容器將其作為參數(shù)傳入過(guò)濾器對(duì)象的init()方法中。 String getFilterName():得到描述符中指定的過(guò)
10、濾器的名字。 String getInitParameter(String name): 返回在部署描述中指定的名字為name的初始化參數(shù)的值。如果不存在返回null. Enumeration getInitParameterNames():返回過(guò)濾器的所有初始化參數(shù)的名字的枚舉集合。 public ServletContext getServletContext():返回Servlet上下文對(duì)象的引用。 過(guò)濾器的部署在實(shí)現(xiàn)一個(gè)過(guò)濾器后,需要在 web.xml 中進(jìn)行注冊(cè)和設(shè)置它所能攔截的資源。這可以通過(guò)和元素來(lái)完成的。 元素(注冊(cè)Filter) 元素用于在Web應(yīng)用程序中注冊(cè)一個(gè)過(guò)濾器。在元
11、素內(nèi) 用于為過(guò)濾器指定一個(gè)名字,該元素的內(nèi)容不能為空。 元素用于指定過(guò)濾器的完整的限定類(lèi)名。 元素用于為過(guò)濾器指定初始化參數(shù),它的子元素指定參數(shù)的名字,指定參數(shù)的值。在過(guò)濾器中,可以使用FilterConfig接口對(duì)象來(lái)訪問(wèn)初始化參數(shù)。 元素(注冊(cè)Filter) testFitler org.test.TestFiter word_file /WEB-INF/word.txt l Servlet容 器 對(duì) 部 署 描 述 符 中 聲 明 的 每 一 個(gè) 過(guò) 濾 器 , 只創(chuàng) 建 一 個(gè) 實(shí) 例 。 與 Servlet類(lèi) 似 , 容 器 將 在 同 一 個(gè) 過(guò) 濾器 實(shí) 例 上 運(yùn) 行 多 個(gè)
12、線 程 來(lái) 同 時(shí) 為 多 個(gè) 請(qǐng) 求 服 務(wù) , 因 此 ,開(kāi) 發(fā) 過(guò) 濾 器 時(shí) , 也 要 注 意 線 程 安 全 的 問(wèn) 題 。 映射 Filter 元素用于設(shè)置一個(gè) Filter 所負(fù)責(zé)攔截的資源。一個(gè)Filter攔截的資源可通過(guò)兩種方式來(lái)指定:Servlet 名稱(chēng)和資源訪問(wèn)的請(qǐng)求路徑( url樣式) 子元素用于設(shè)置filter的注冊(cè)名稱(chēng)。該值必須是在元素中聲明過(guò)的過(guò)濾器的名字 設(shè)置 filter 所攔截的請(qǐng)求路徑(過(guò)濾器關(guān)聯(lián)的URL樣式) 指定過(guò)濾器所攔截的Servlet名稱(chēng)。 指定過(guò)濾器所攔截的資源被 Servlet 容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORW
13、ARD和ERROR之一,默認(rèn)REQUEST. 可以設(shè)置多個(gè) 子元素用來(lái)指定 Filter 對(duì)資源的多種調(diào)用方式進(jìn)行攔截 映射 Filter 子元素可以設(shè)置的值及其意義: REQUEST:當(dāng)用戶(hù)直接訪問(wèn)頁(yè)面時(shí),Web容器將會(huì)調(diào)用過(guò)濾器。如果目標(biāo)資源是通過(guò)RequestDispatcher的include()或forward()方法訪問(wèn)時(shí),那么該過(guò)濾器就不會(huì)被調(diào)用。 INCLUDE:如果目標(biāo)資源是通過(guò)RequestDispatcher的include()方法訪問(wèn)時(shí),那么該過(guò)濾器將被調(diào)用。除此之外,該過(guò)濾器不會(huì)被調(diào)用。 FORWARD:如果目標(biāo)資源是通過(guò)RequestDispatcher的forwa
14、rd()方法訪問(wèn)時(shí),那么該過(guò)濾器將被調(diào)用,除此之外,該過(guò)濾器不會(huì)被調(diào)用。 ERROR:如果目標(biāo)資源是通過(guò)聲明式異常處理機(jī)制調(diào)用時(shí),那么該過(guò)濾器將被調(diào)用。除此之外,過(guò)濾器不會(huì)被調(diào)用。 映射 Filter testFilter /index.jsp REQUEST FORWARD testFilter /test.jsp 映射 Filter在同一個(gè) web.xml 文件中可以為同一個(gè) Filter 設(shè)置多個(gè)映射。若一個(gè) Filter 鏈中多次出現(xiàn)了同一個(gè) Filter 程序,這個(gè) Filter 程序的攔截處理過(guò)程將被多次執(zhí)行 典型應(yīng)用1:使瀏覽器不緩存頁(yè)面的過(guò)濾器:有 3 個(gè) HTTP 響應(yīng)頭字段
15、都可以禁止瀏覽器緩存當(dāng)前頁(yè)面,它們?cè)?Servlet 中的示例代碼如下: response.setDateHeader(Expires,-1); response.setHeader(Cache-Control,no-cache); response.setHeader(Pragma,no-cache);并不是所有的瀏覽器都能完全支持上面的三個(gè)響應(yīng)頭,因此最好是同時(shí)使用上面的三個(gè)響應(yīng)頭 典型應(yīng)用2:字符編碼的過(guò)濾器通過(guò)配置參數(shù)encoding指明使用何種字符編碼,以處理Html Form請(qǐng)求參數(shù)的中文問(wèn)題 典型應(yīng)用3:檢測(cè)用戶(hù)是否登陸的過(guò)濾器:情景:系統(tǒng)中的某些頁(yè)面只有在正常登陸后才可以使用,
16、用戶(hù)請(qǐng)求這些頁(yè)面時(shí)要檢查 session 中有無(wú)該用戶(hù)信息,但在所有必要的頁(yè)面加上session的判斷相當(dāng)麻煩的事情解決方案:編寫(xiě)一個(gè)用于檢測(cè)用戶(hù)是否登陸的過(guò)濾器,如果用戶(hù)未登錄,則重定向到指的登錄頁(yè)面要求:需檢查的在 Session 中保存的關(guān)鍵字; 如果用戶(hù)未登錄,需重定向到指定的頁(yè)面(URL不包括 ContextPath); 不做檢查的URL列表(以分號(hào)分開(kāi),并且 URL 中不包括 ContextPath)都要采取可配置的方式 典型應(yīng)用4:利用Filter限制用戶(hù)瀏覽權(quán)限 裝飾 HttpServletRequest 對(duì)象 需求:在 HttpServletRequest 對(duì)象到達(dá) Serv
17、let 之前把用戶(hù)輸入的多余空格都去掉情景:因?yàn)?HttpServletRequest 對(duì)象里的請(qǐng)求參數(shù)都實(shí)際包含在 java.util.Map 對(duì)象里,而Map是不允許修改的,所以包含在 HttpServletRequest 對(duì)象里的請(qǐng)求參數(shù)不能被修改解決方案:采取 Decorator(裝飾器)模式 Decorator 模式因?yàn)槔^承的關(guān)系,當(dāng)需要改變某個(gè)對(duì)象的行為時(shí),只須擴(kuò)展這個(gè)對(duì)象所屬的類(lèi)并重寫(xiě)其有關(guān)的方法就可以達(dá)到目的。但是,當(dāng)想要改變其行為的對(duì)象是由應(yīng)用程序里的另一個(gè)子系統(tǒng)(例如:一個(gè)對(duì)象工廠或是一個(gè)Servlet 容器)負(fù)責(zé)構(gòu)造,繼承機(jī)制將無(wú)能為力 Decorator 模式-情景已知
18、:Messager 類(lèi)的定義(可以從它派生處一個(gè)之類(lèi));Messager 對(duì)象總是來(lái)自一個(gè)對(duì)象工廠(MessagerFactory),該工廠可以對(duì)它創(chuàng)建的每一個(gè) Messager 對(duì)象進(jìn)行初始化-通過(guò)調(diào)用 getMessage() 方法而獲得的 message 屬性也不例外(即不能對(duì) Messager 對(duì)象進(jìn)行初始化)假設(shè):需要使用 Messager 類(lèi)的 getMessage() 方法。有一個(gè)Util的使用工具類(lèi),該類(lèi)中有如下方法: public static void broadcast(Message messager) System.out.println(messager.getMe
19、ssage(); Decorator 模式-需求,方案需求:讓 broadcast 方法打印的字母都是大寫(xiě)字母方案:從 Messager 類(lèi)派生一個(gè)子類(lèi),把子類(lèi)對(duì)象傳遞給 broadcast 方法。因?yàn)橹挥袑?duì)象工廠知道如何初始化 Messager 對(duì)象,所以該方案無(wú)意義 Decorator 模式:從 Messager 類(lèi)派生一個(gè)子類(lèi) MessagerDecorator,把子類(lèi)對(duì)象傳遞給 broadcast 方法在 MessagerDecorator 類(lèi)里實(shí)現(xiàn)構(gòu)造器:接受一個(gè) Messager 對(duì)象作為輸入?yún)?shù),而這個(gè) Messager 就是想要裝飾的對(duì)象:public MessagerDeco
20、rator(Messager messager)重寫(xiě) getMessage 方法,讓重寫(xiě)的方法用大寫(xiě)字母來(lái)返回 message 屬性 HttpServletRequestWrapper 類(lèi) Servlet API 中提供了一個(gè) HttpServletRequestWrapper 類(lèi)來(lái)包裝原始的 request 對(duì)象, HttpServletRequestWrapper 類(lèi)實(shí)現(xiàn)了 HttpServletRequest 接口中的所有方法,這些方法的內(nèi)部實(shí)現(xiàn)都是僅僅調(diào)用了一下所包裝的的 request 對(duì)象的對(duì)應(yīng)方法相類(lèi)似 Servlet API 也提供了一個(gè) HttpServletResponse
21、Wrapper 類(lèi)來(lái)包裝原始的 response 對(duì)象 典型應(yīng)用5:為論壇過(guò)濾不雅文字和HTML特殊字符開(kāi)發(fā)論壇模塊時(shí)要解決以下兩個(gè)問(wèn)題: 1. 用戶(hù)回復(fù)或發(fā)帖時(shí)可能會(huì)輸入 HTML 代碼(例如:等),這可能會(huì)破壞論壇的正常顯示,也可能會(huì)帶來(lái)安全隱患。 2. 某些用戶(hù)在回復(fù)時(shí)可能會(huì)輸入不雅子句,這些子句會(huì)給論壇帶來(lái)不好的影響 3. 實(shí)現(xiàn)對(duì)不雅文字的可配置要求:不雅文字及其替換內(nèi)容實(shí)現(xiàn)可配置。 留言程序數(shù)據(jù)庫(kù)的表字 段 名 稱(chēng) 類(lèi) 型 說(shuō) 明 是 否 為 空title varchar(90) 留 言 的 標(biāo) 題 noname varchar(20) 留 言 者 的 姓 名 noemail varchar(50) 留 言 者 的 email nocontent varchar(500) 留 言 的 具 體 內(nèi) 容 nodate_time Date 留 言 的 時(shí) 間 no 例子:開(kāi)發(fā)一個(gè)留言板程序 例子:開(kāi)發(fā)一個(gè)留言板程序
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 110中國(guó)人民警察節(jié)(筑牢忠誠(chéng)警魂感受別樣警彩)
- 2025正字當(dāng)頭廉字入心爭(zhēng)當(dāng)公安隊(duì)伍鐵軍
- XX國(guó)企干部警示教育片觀后感筑牢信仰之基堅(jiān)守廉潔底線
- 2025做擔(dān)當(dāng)時(shí)代大任的中國(guó)青年P(guān)PT青年思想教育微黨課
- 2025新年工作部署會(huì)圍繞六個(gè)干字提要求
- XX地區(qū)中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 支部書(shū)記上黨課筑牢清廉信念為高質(zhì)量發(fā)展?fàn)I造風(fēng)清氣正的環(huán)境
- 冬季消防安全知識(shí)培訓(xùn)冬季用電防火安全
- 2025加強(qiáng)政治引領(lǐng)(政治引領(lǐng)是現(xiàn)代政黨的重要功能)
- 主播直播培訓(xùn)直播技巧與方法
- 2025六廉六進(jìn)持續(xù)涵養(yǎng)良好政治生態(tài)
- 員工職業(yè)生涯規(guī)劃方案制定個(gè)人職業(yè)生涯規(guī)劃
- 2024年XX地區(qū)黨建引領(lǐng)鄉(xiāng)村振興工作總結(jié)
- XX中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 幼兒園期末家長(zhǎng)會(huì)長(zhǎng)長(zhǎng)的路慢慢地走