尚filterlistener課件及源碼_第1頁(yè)
尚filterlistener課件及源碼_第2頁(yè)
尚filterlistener課件及源碼_第3頁(yè)
尚filterlistener課件及源碼_第4頁(yè)
尚filterlistener課件及源碼_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

提出問題應(yīng)用中常有這樣的功能:1.有好些頁(yè)面只有是登陸的客戶才能查看顯示2.Servlet在獲取請(qǐng)求參數(shù)時(shí),為了防止中文亂碼,都需要設(shè)置請(qǐng)求編碼字符集如果用現(xiàn)有的知識(shí)去做的話,需要在每個(gè)jsp或Servlet中做同樣的操作,如何簡(jiǎn)化這種重復(fù)性的操作呢?過濾器:Filter現(xiàn)實(shí)案例一輛地鐵車有好些門,

你可以從任意一個(gè)進(jìn)入坐地鐵,

但需要你花2元錢才可以坐上,那現(xiàn)在

怎么解決這個(gè)問題呢?方法1:在地鐵的每個(gè)門都設(shè)置一個(gè)關(guān)卡刷卡方法2:

在站臺(tái)外設(shè)置一個(gè)

的關(guān)卡來刷卡,如果有錢才可以進(jìn)行坐車,

要沒有錢不能讓你進(jìn)站方法2使用的就是過濾器技術(shù),這樣能極大的提高代碼的復(fù)用Filter(過濾器)簡(jiǎn)介Filter的基本功能是對(duì)

Servlet容器調(diào)用

Servlet(JSP)的過程進(jìn)行

,從而在

Servlet處理請(qǐng)求前和Servlet響應(yīng)請(qǐng)求后實(shí)現(xiàn)一些特殊的功能。在

Servlet

API

中定義了三個(gè)接口類來開供開發(fā) 編寫Filter

程序:Filter,FilterChain,FilterConfigFilter

程序是一個(gè)實(shí)現(xiàn)了Filter

接口的Java

類,與Servlet

程序相似,它由Servlet容器進(jìn)行調(diào)用和執(zhí)行Filter

程序需要在

web.xml

文件中進(jìn)行 和設(shè)置它所能的資源:Filter

程序可以

Jsp,

Servlet,

靜態(tài)

文件和靜態(tài)html文件Filter

的過濾過程Filter

的過濾過程Filter

的基本工作原理當(dāng)在

web.xml

了一個(gè)

Filter

來對(duì)某個(gè)

Servlet

程序進(jìn)行

處理時(shí),這個(gè)

Filter

就成了

Tomcat與該

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)用程序中可以

多個(gè)

Filter

程序,每個(gè)

Filter

程序都可以對(duì)一個(gè)或一組

Servlet

程序進(jìn)行

。若有多個(gè)

Filter

程序?qū)δ硞€(gè)

Servlet

程序的

過程進(jìn)行

,當(dāng)針對(duì)該

Servlet

請(qǐng)求到達(dá)時(shí),web

容器將把這多個(gè)

Filter

程序組一個(gè)

Filter

鏈(過濾器鏈)。Filter

鏈中各個(gè)

Filter

順序與它們?cè)趹?yīng)用程序的

web.xml

的順序一致Filter

接口init(FilterConfig

filterConfig)throws

ServletException:在

web

應(yīng)用程序啟動(dòng)時(shí),web

服務(wù)器將根據(jù)

web.xml

文件中的配置信息來創(chuàng)建每個(gè)

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類似)。利用FilterConfig對(duì)象可以得到ServletContext對(duì)象,以及部署描述符中配置的過濾器的初始化參數(shù)。在這個(gè)方法中,可以拋出ServletException異常,通知容器該過濾器不能正常工作。destroy():在Web容器卸載

Filter對(duì)象之前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個(gè)方法中,可以

過濾器使用的資源與開發(fā)Servlet不同的是,F(xiàn)ilter接口并沒有相應(yīng)的實(shí)現(xiàn)類可供繼承,要開發(fā)過濾器,只能直接實(shí)現(xiàn)Filter接口。Filter

接口doFilter(ServletRequest

request,ServletResponse

response,FilterChain

chain)throws

java.io.IOException,ServletException:doFilter()方法類似于Servlet接口的service()方法。當(dāng)客戶端請(qǐng)求目標(biāo)資源的時(shí)候,容器就會(huì)調(diào)用與這個(gè)目標(biāo)資源相關(guān)聯(lián)的過濾器的

doFilter()方法。其中參數(shù)

request,

response

web

容器或

Filter鏈的上一個(gè)

Filter

傳遞過來的請(qǐng)求和相應(yīng)對(duì)象;參數(shù)chain

為代表當(dāng)前

Filter鏈的對(duì)象,在特定的操作完成后,可以在當(dāng)前

Filter

對(duì)象的

doFilter

方法

需要調(diào)用

FilterChain

對(duì)象的

chain.doFilter(request,response)方法才能把請(qǐng)求交付給

Filter鏈中的下一個(gè)

Filter

或者目標(biāo)

Servlet程序去處理,也可以直接向客戶端返回響應(yīng)信息,或者利用RequestDispatcher的forward()和

include()方法,以及HttpServletResponse的sendRedirect()方法將請(qǐng)求轉(zhuǎn)向到其他資源。這個(gè)方法的請(qǐng)求和響應(yīng)參數(shù)的類型是ServletRequest和ServletResponse,也就是

濾器的使用并不依賴于具體的協(xié)議。FilterChain接口FilterChain接口:代表當(dāng)前Filter鏈的對(duì)象。由容器實(shí)現(xiàn),容器將其實(shí)例作為參數(shù)傳入過濾器對(duì)象的doFilter()方法中。過濾器對(duì)象使用FilterChain對(duì)象調(diào)用過濾器鏈中的下一個(gè)過濾器,如果該過濾器是鏈中最后一個(gè)過濾器,那么將調(diào)用目標(biāo)資源。doFilter(ServletRequest

request,ServletResponseresponse)throwsjava.io.IOException:調(diào)用該方法將使過濾器鏈中的下一個(gè)過濾器被調(diào)用。如果是最后一個(gè)過濾器,會(huì)調(diào)用目標(biāo)資源。Filter

的過濾過程瀏覽器/day07/test.jspTomcatTest.jspTest1Filter1doFilter(filterChain){//do

domething(1)filterChain.doFilter()//do

something}在請(qǐng)求到資源前做些事在資源處理完請(qǐng)求返回后做些事Test2Filter2doFilter(filterChain){//do

domething(2)filterChain.doFilter()//do

something}Filter

的過濾過程瀏覽器/day07/test.jspTest.jspBefore()

2After()

2UserNamePasswordFilterConfig

接口javax.servlet.FilterConfig接口:該接口類似于ServletConfig接口,由容器實(shí)現(xiàn)。Servlet規(guī)范將代表ServletContext對(duì)象和

Filter

的配置參數(shù)信息都封裝在該對(duì)象中。Servlet容器將其作為參數(shù)傳入過濾器對(duì)象的init()方法中。String

getFilterName():得到描述符中指定的過濾器的名字。String

getInitParameter(String

name):返回在部署描述中指定的名字為name的初始化參數(shù)的值。如果不存在返回null.

EnumerationgetInitParameterNames():返回過濾器的所有初始化參數(shù)的名字的枚舉集合。publicServletContextgetServletContext():返回Servlet上下文對(duì)象的

。過濾器的部署在實(shí)現(xiàn)一個(gè)過濾器后,需要在

web.xml中進(jìn)行和設(shè)置它所能 的資源。這可以通過<filter>和<filter-map

>元素來完成的。<filter>

元素(Filter)一個(gè)過濾器。<filter>元素用于在Web應(yīng)用程序中在<filter>元素內(nèi)<filter-name>用于為過濾器指定一個(gè)名字,該元素的內(nèi)容不能為空。<filter-class>元素用于指定過濾器的完整的限定類名。<init-param>元素用于為過濾器指定初始化參數(shù),它的子元素<param-name>指定參數(shù)的名字,<param-value>指定參數(shù)的值。在過濾器中,可以使用FilterConfig接口對(duì)象來 初始化參數(shù)。<filter>

元素(

Filter)<filter><filter-name>testFitler</filter-name><filter-class>

.test.TestFiter</filter-class><init-param><param-name>word_file</param-name><param-value>/WEB-INF/word.txt</param-value></init-param></filter>Servlet容器對(duì)部署描述符中的每一個(gè)過濾器,只創(chuàng)建一個(gè)實(shí)例。與Servlet類似,容器將在同一個(gè)過濾器實(shí)例上運(yùn)行多個(gè)線程來同時(shí)為多個(gè)請(qǐng)求服務(wù),因此,開發(fā)過濾器時(shí),也要注意線程安全的問題。Filter>元素用于設(shè)置一個(gè)

Filter所負(fù)責(zé) 的資的資源可通過兩種方式來指定:Servlet<filter-map源。一個(gè)Filter名稱和資源的請(qǐng)求路徑(url樣式)–

<filter-name>子元素用于設(shè)置filter的

名稱。該值必須是在<filter>元素中

過的過濾器的名字<url-pattern>設(shè)置

filter所<servlet-name>指定過濾器所<dispatcher>指定過濾器所的請(qǐng)求路徑(過濾器關(guān)聯(lián)的URL樣式)的Servlet名稱。的資源被

Servlet

容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST.可以設(shè)置多個(gè)<dispatcher>子元素用來指定

Filter

對(duì)資源的多種調(diào)用方式進(jìn)行Filter<dispatcher>子元素可以設(shè)置的值及其意義:REQUEST:當(dāng)用戶直接 頁(yè)面時(shí),Web容器將會(huì)調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法 時(shí),那么該過濾器就不會(huì)被調(diào)用。INCLUDE:如果目標(biāo)資源是通過RequestDispatcher的include()方法

時(shí),那么該過濾器將被調(diào)用。除此之外,該過濾器不會(huì)被調(diào)用。FORWARD:如果目標(biāo)資源是通過RequestDispatcher的forward()方法 時(shí),那么該過濾器將被調(diào)用,除此之外,該過濾器不會(huì)被調(diào)用。ERROR:如果目標(biāo)資源是通過 式異常處理機(jī)制調(diào)用時(shí),那么該過濾器將被調(diào)用。除此之外,過濾器不會(huì)被調(diào)用。Filter<filter-map

><filter-name>testFilter</filter-name><url-pattern>/index.jsp</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-map

><filter-map

><filter-name>testFilter</filter-name><url-pattern>/test.jsp</url-pattern></filter-map

>Filter在同一個(gè)web.xml

文件中可以為同一個(gè)Filter

設(shè)置多個(gè)。若一個(gè)

Filter

鏈中多次出現(xiàn)了同一個(gè)

Filter

程序,這個(gè)

Filter

程序的 處理過程將被多次執(zhí)行o.jspl.jspLogin.jsplogin.jspUserNameFilterPasswordFiltero.jsplogin.jsp

請(qǐng)求提交到

o.jsp。該頁(yè)面中有兩個(gè)

text,分別為username

passwordUserNameFilter、PasswordFilter login.jsp

的請(qǐng)求頁(yè)面,即

o.jspUserNameFilter:若username不等于Tom,則將請(qǐng)求轉(zhuǎn)發(fā)到

login.jsp,并提示用戶:“用戶名錯(cuò)誤”,若等于Tom,則把請(qǐng)求轉(zhuǎn)給下一個(gè)FilterPasswordFilter:若passord不等于1234,則將請(qǐng)求轉(zhuǎn)發(fā)到login.jsp,并提示用戶:“錯(cuò)誤”,若等于1234,則把請(qǐng)求轉(zhuǎn)給目標(biāo)頁(yè)面練

:使用Filter實(shí)現(xiàn)用戶名和

的過濾IEweb_14/app1/o.jspTomcato.jspNameFilterPasswordFilterpath

:

web_14/app1/

o.jsp練習(xí)2:禁用緩存使瀏覽器不緩存頁(yè)面的過濾器:瀏覽器緩存當(dāng)前頁(yè)面,它們有3

個(gè)HTTP

響應(yīng)頭字段都可以在Servlet

中的示例代碼如下:resp.setDateHeader("Expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");并不是所有的瀏覽器都能完全支持上面的三個(gè)響應(yīng)頭,因此最好是同時(shí)使用上面的三個(gè)響應(yīng)頭練習(xí)3:解決中文亂碼字符編碼的過濾器–通過配置參數(shù)encoding指明使用何種字符編碼,以處理Form請(qǐng)求參數(shù)的中文問題練習(xí)4:檢測(cè)用戶是否登陸情景:系統(tǒng)中的某些頁(yè)面只有在正常登陸后才可以使用,用戶請(qǐng)求這些頁(yè)面時(shí)要檢查

session

中有無該用戶信息,但在所有必要的頁(yè)面加上session的判斷相當(dāng)麻煩的事情解決方案:編寫一個(gè)用于檢測(cè)用戶是否登陸的過濾器,如果用戶未登錄,則重定向到指的登錄頁(yè)面要求:需檢查的在

Session

中保存的關(guān)鍵字;如果用戶未登錄,需重定向到指定的頁(yè)面(URL不包括

ContextPath);不做檢查的URL列表(以分號(hào)分開,并且

URL

中不包括

ContextPath)都要采取可配置的方式練習(xí)6:為過濾不雅文字和HTML特殊字符開 壇模塊時(shí)要解決以下兩個(gè)問題:1.

用戶回復(fù)或發(fā)帖時(shí)可能會(huì)輸入

HTML

代碼(例如:<,

>等),這可能會(huì)破壞

的正常顯示,也可能會(huì)帶來安全隱患。2.某些用戶在回復(fù)時(shí)可能會(huì)輸入不雅子句,這些子句會(huì)給論壇帶來不好的影響3.實(shí)現(xiàn)對(duì)不雅文字的可配置要求:不雅文字及其替換內(nèi)容實(shí)現(xiàn)可配置。***裝飾

HttpServletRequest

對(duì)象需求:在HttpServletRequest

對(duì)象到達(dá)Servlet

之前把用戶輸入的多余空格都去掉情景:因?yàn)镠ttpServletRequest

對(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ì)象所屬的類并重寫其有關(guān)的方法就可以達(dá)到目的。但是,當(dāng)想要改變其行為的對(duì)象是由應(yīng)用程序里的另一個(gè)

子系統(tǒng)(例如:一個(gè)對(duì)象工廠或是一個(gè)Servlet

容器)負(fù)責(zé)構(gòu)造,繼承機(jī)制將 為力Decorator

模式----情景已知:Messager

類的定義(可以從它派生處一個(gè)之類);Messager

對(duì)象總是來自一個(gè)對(duì)象工廠(MessagerFactory),該工廠可以對(duì)它創(chuàng)建的每一個(gè)Messager

對(duì)象進(jìn)行初始化----通過調(diào)用getMessage()方法而獲得的message

屬性也不例外(即不能對(duì)Messager

對(duì)象進(jìn)行初始化)假設(shè):需要使用Messager

類的getMessage()方法。有一個(gè)Util的使用工具類,該類中有如下方法:public

static

void

broadcast(Message

messager){System.out.println(messager.getMessage());}Decorator

模式----需求,方案需求:讓broadcast

方法打印的字母都是大寫字母方案:從Messager

類派生一個(gè)子類,把子類對(duì)象傳遞給broadcast

方法。因?yàn)橹挥袑?duì)象工廠知道如何初始化Messager

對(duì)象,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論