下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
提出問(wèn)題應(yīng)用中常有這樣的功能:1.有好些頁(yè)面只有是登陸的客戶(hù)才能查看顯示2.Servlet在獲取請(qǐng)求參數(shù)時(shí),為了防止中文亂碼,都需要設(shè)置請(qǐng)求編碼字符集如果用現(xiàn)有的知識(shí)去做的話(huà),需要在每個(gè)jsp或Servlet中做同樣的操作,如何簡(jiǎn)化這種重復(fù)性的操作呢?過(guò)濾器:Filter現(xiàn)實(shí)案例一輛地鐵車(chē)有好些門(mén),
你可以從任意一個(gè)進(jìn)入坐地鐵,
但需要你花2元錢(qián)才可以坐上,那現(xiàn)在
怎么解決這個(gè)問(wèn)題呢?方法1:在地鐵的每個(gè)門(mén)都設(shè)置一個(gè)關(guān)卡刷卡方法2:
在站臺(tái)外設(shè)置一個(gè)
的關(guān)卡來(lái)刷卡,如果有錢(qián)才可以進(jìn)行坐車(chē),
要沒(méi)有錢(qián)不能讓你進(jìn)站方法2使用的就是過(guò)濾器技術(shù),這樣能極大的提高代碼的復(fù)用Filter(過(guò)濾器)簡(jiǎn)介Filter的基本功能是對(duì)
Servlet容器調(diào)用
Servlet(JSP)的過(guò)程進(jìn)行
,從而在
Servlet處理請(qǐng)求前和Servlet響應(yīng)請(qǐng)求后實(shí)現(xiàn)一些特殊的功能。在
Servlet
API
中定義了三個(gè)接口類(lèi)來(lái)開(kāi)供開(kāi)發(fā) 編寫(xiě)Filter
程序:Filter,FilterChain,FilterConfigFilter
程序是一個(gè)實(shí)現(xiàn)了Filter
接口的Java
類(lèi),與Servlet
程序相似,它由Servlet容器進(jìn)行調(diào)用和執(zhí)行Filter
程序需要在
web.xml
文件中進(jìn)行 和設(shè)置它所能的資源:Filter
程序可以
Jsp,
Servlet,
靜態(tài)
文件和靜態(tài)html文件Filter
的過(guò)濾過(guò)程Filter
的過(guò)濾過(guò)程Filter
的基本工作原理當(dāng)在
web.xml
中
了一個(gè)
Filter
來(lái)對(duì)某個(gè)
Servlet
程序進(jìn)行
處理時(shí),這個(gè)
Filter
就成了
Tomcat與該
Servlet
程序的通信線(xiàn)
的一道關(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
程序的
過(guò)程進(jìn)行
,當(dāng)針對(duì)該
Servlet
的
請(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.xml
文件中的配置信息來(lái)創(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類(lèi)似)。利用FilterConfig對(duì)象可以得到ServletContext對(duì)象,以及部署描述符中配置的過(guò)濾器的初始化參數(shù)。在這個(gè)方法中,可以?huà)伋鯯ervletException異常,通知容器該過(guò)濾器不能正常工作。destroy():在Web容器卸載
Filter對(duì)象之前被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個(gè)方法中,可以
過(guò)濾器使用的資源與開(kāi)發(fā)Servlet不同的是,F(xiàn)ilter接口并沒(méi)有相應(yīng)的實(shí)現(xiàn)類(lèi)可供繼承,要開(kāi)發(fā)過(guò)濾器,只能直接實(shí)現(xiàn)Filter接口。Filter
接口doFilter(ServletRequest
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)求和相應(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程序去處理,也可以直接向客戶(hù)端返回響應(yīng)信息,或者利用RequestDispatcher的forward()和
include()方法,以及HttpServletResponse的sendRedirect()方法將請(qǐng)求轉(zhuǎn)向到其他資源。這個(gè)方法的請(qǐng)求和響應(yīng)參數(shù)的類(lèi)型是ServletRequest和ServletResponse,也就是
濾器的使用并不依賴(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(ServletRequest
request,ServletResponseresponse)throwsjava.io.IOException:調(diào)用該方法將使過(guò)濾器鏈中的下一個(gè)過(guò)濾器被調(diào)用。如果是最后一個(gè)過(guò)濾器,會(huì)調(diào)用目標(biāo)資源。Filter
的過(guò)濾過(guò)程瀏覽器/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
的過(guò)濾過(guò)程瀏覽器/day07/test.jspTest.jspBefore()
2After()
2UserNamePasswordFilterConfig
接口javax.servlet.FilterConfig接口:該接口類(lèi)似于ServletConfig接口,由容器實(shí)現(xiàn)。Servlet規(guī)范將代表ServletContext對(duì)象和
Filter
的配置參數(shù)信息都封裝在該對(duì)象中。Servlet容器將其作為參數(shù)傳入過(guò)濾器對(duì)象的init()方法中。String
getFilterName():得到描述符中指定的過(guò)濾器的名字。String
getInitParameter(String
name):返回在部署描述中指定的名字為name的初始化參數(shù)的值。如果不存在返回null.
EnumerationgetInitParameterNames():返回過(guò)濾器的所有初始化參數(shù)的名字的枚舉集合。publicServletContextgetServletContext():返回Servlet上下文對(duì)象的
。過(guò)濾器的部署在實(shí)現(xiàn)一個(gè)過(guò)濾器后,需要在
web.xml中進(jìn)行和設(shè)置它所能 的資源。這可以通過(guò)<filter>和<filter-map
>元素來(lái)完成的。<filter>
元素(Filter)一個(gè)過(guò)濾器。<filter>元素用于在Web應(yīng)用程序中在<filter>元素內(nèi)<filter-name>用于為過(guò)濾器指定一個(gè)名字,該元素的內(nèi)容不能為空。<filter-class>元素用于指定過(guò)濾器的完整的限定類(lèi)名。<init-param>元素用于為過(guò)濾器指定初始化參數(shù),它的子元素<param-name>指定參數(shù)的名字,<param-value>指定參數(shù)的值。在過(guò)濾器中,可以使用FilterConfig接口對(duì)象來(lái) 初始化參數(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è)過(guò)濾器,只創(chuàng)建一個(gè)實(shí)例。與Servlet類(lèi)似,容器將在同一個(gè)過(guò)濾器實(shí)例上運(yùn)行多個(gè)線(xiàn)程來(lái)同時(shí)為多個(gè)請(qǐng)求服務(wù),因此,開(kāi)發(fā)過(guò)濾器時(shí),也要注意線(xiàn)程安全的問(wèn)題。Filter>元素用于設(shè)置一個(gè)
Filter所負(fù)責(zé) 的資的資源可通過(guò)兩種方式來(lái)指定:Servlet<filter-map源。一個(gè)Filter名稱(chēng)和資源的請(qǐng)求路徑(url樣式)–
<filter-name>子元素用于設(shè)置filter的
名稱(chēng)。該值必須是在<filter>元素中
過(guò)的過(guò)濾器的名字<url-pattern>設(shè)置
filter所<servlet-name>指定過(guò)濾器所<dispatcher>指定過(guò)濾器所的請(qǐng)求路徑(過(guò)濾器關(guān)聯(lián)的URL樣式)的Servlet名稱(chēng)。的資源被
Servlet
容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST.可以設(shè)置多個(gè)<dispatcher>子元素用來(lái)指定
Filter
對(duì)資源的多種調(diào)用方式進(jìn)行Filter<dispatcher>子元素可以設(shè)置的值及其意義:REQUEST:當(dāng)用戶(hù)直接 頁(yè)面時(shí),Web容器將會(huì)調(diào)用過(guò)濾器。如果目標(biāo)資源是通過(guò)RequestDispatcher的include()或forward()方法 時(shí),那么該過(guò)濾器就不會(huì)被調(diào)用。INCLUDE:如果目標(biāo)資源是通過(guò)RequestDispatcher的include()方法
時(shí),那么該過(guò)濾器將被調(diào)用。除此之外,該過(guò)濾器不會(huì)被調(diào)用。FORWARD:如果目標(biāo)資源是通過(guò)RequestDispatcher的forward()方法 時(shí),那么該過(guò)濾器將被調(diào)用,除此之外,該過(guò)濾器不會(huì)被調(diào)用。ERROR:如果目標(biāo)資源是通過(guò) 式異常處理機(jī)制調(diào)用時(shí),那么該過(guò)濾器將被調(diào)用。除此之外,過(guò)濾器不會(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
程序的 處理過(guò)程將被多次執(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,并提示用戶(hù):“用戶(hù)名錯(cuò)誤”,若等于Tom,則把請(qǐng)求轉(zhuǎn)給下一個(gè)FilterPasswordFilter:若passord不等于1234,則將請(qǐng)求轉(zhuǎn)發(fā)到login.jsp,并提示用戶(hù):“錯(cuò)誤”,若等于1234,則把請(qǐng)求轉(zhuǎn)給目標(biāo)頁(yè)面練
:使用Filter實(shí)現(xiàn)用戶(hù)名和
的過(guò)濾IEweb_14/app1/o.jspTomcato.jspNameFilterPasswordFilterpath
:
web_14/app1/
o.jsp練習(xí)2:禁用緩存使瀏覽器不緩存頁(yè)面的過(guò)濾器:瀏覽器緩存當(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:解決中文亂碼字符編碼的過(guò)濾器–通過(guò)配置參數(shù)encoding指明使用何種字符編碼,以處理Form請(qǐng)求參數(shù)的中文問(wèn)題練習(xí)4:檢測(cè)用戶(hù)是否登陸情景:系統(tǒng)中的某些頁(yè)面只有在正常登陸后才可以使用,用戶(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)都要采取可配置的方式練習(xí)6:為過(guò)濾不雅文字和HTML特殊字符開(kāi) 壇模塊時(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)可配置。***裝飾
HttpServletRequest
對(duì)象需求:在HttpServletRequest
對(duì)象到達(dá)Servlet
之前把用戶(hù)輸入的多余空格都去掉情景:因?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ì)象所屬的類(lèi)并重寫(xiě)其有關(guān)的方法就可以達(dá)到目的。但是,當(dāng)想要改變其行為的對(duì)象是由應(yīng)用程序里的另一個(gè)
子系統(tǒng)(例如:一個(gè)對(duì)象工廠(chǎng)或是一個(gè)Servlet
容器)負(fù)責(zé)構(gòu)造,繼承機(jī)制將 為力Decorator
模式----情景已知:Messager
類(lèi)的定義(可以從它派生處一個(gè)之類(lèi));Messager
對(duì)象總是來(lái)自一個(gè)對(duì)象工廠(chǎng)(MessagerFactory),該工廠(chǎng)可以對(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.getMessage());}Decorator
模式----需求,方案需求:讓broadcast
方法打印的字母都是大寫(xiě)字母方案:從Messager
類(lèi)派生一個(gè)子類(lèi),把子類(lèi)對(duì)象傳遞給broadcast
方法。因?yàn)橹挥袑?duì)象工廠(chǎng)知道如何初始化Messager
對(duì)象,
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 增強(qiáng)現(xiàn)實(shí)與人工智能協(xié)同的模擬訓(xùn)練-深度研究
- 互聯(lián)網(wǎng)平臺(tái)競(jìng)爭(zhēng)態(tài)勢(shì)分析-深度研究
- 企業(yè)文化創(chuàng)新與績(jī)效關(guān)系-深度研究
- 太陽(yáng)能光伏組件回收技術(shù)-深度研究
- 指令寄存器容錯(cuò)設(shè)計(jì)方法-深度研究
- 分布式能源系統(tǒng)的功率預(yù)測(cè)技術(shù)-深度研究
- 云API接口優(yōu)化策略-深度研究
- 農(nóng)業(yè)生物多樣性保護(hù)與技術(shù)轉(zhuǎn)化-深度研究
- 創(chuàng)新擴(kuò)散路徑優(yōu)化-深度研究
- 患者滿(mǎn)意度提升路徑-深度研究
- 二零二五年度無(wú)人駕駛車(chē)輛測(cè)試合同免責(zé)協(xié)議書(shū)
- 2025年湖北華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員52名歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 高三日語(yǔ)一輪復(fù)習(xí)助詞「と」的用法課件
- 毛渣采購(gòu)合同范例
- 2023中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- 五年級(jí)上冊(cè)小數(shù)遞等式計(jì)算200道及答案
- 2024年廣東高考政治真題考點(diǎn)分布匯 總- 高考政治一輪復(fù)習(xí)
- 燃?xì)夤艿滥甓葯z驗(yàn)報(bào)告
- GB/T 44052-2024液壓傳動(dòng)過(guò)濾器性能特性的標(biāo)識(shí)
- 國(guó)際市場(chǎng)營(yíng)銷(xiāo)環(huán)境案例分析
- 滑雪指導(dǎo)員理論考試復(fù)習(xí)題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論