版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JavaWeb程序設(shè)計(jì)
——Servlet編程(3)2主要內(nèi)容過(guò)濾器(Filter)概述
FilterAPIFilter接口FilterConfig接口FilterChain接口過(guò)濾器的創(chuàng)建與部署3過(guò)濾器(Filter)概述
在Web應(yīng)用程序中,過(guò)濾器位于服務(wù)器端,在客戶端和服務(wù)器端資源之間過(guò)濾請(qǐng)求和響應(yīng)數(shù)據(jù)。過(guò)濾器(Filters)是在Servlet2.3規(guī)范中引入的新功能,并在Servlet2.4規(guī)范中得到增強(qiáng)。過(guò)濾器是一種Web組件,它們攔截請(qǐng)求和響應(yīng),以查看、提取或以某種方式操作客戶機(jī)和服務(wù)器之間交換的數(shù)據(jù)。
4
對(duì)于Web應(yīng)用,過(guò)濾器是駐留在服務(wù)器端,對(duì)Web請(qǐng)求和Web響應(yīng)的頭屬性(Header)和內(nèi)容體(Body)進(jìn)行操作的一種特殊Web組件。如下圖所示:
客戶端瀏覽器Web容器目標(biāo)資源過(guò)濾器請(qǐng)求響應(yīng)圖1過(guò)濾器示意圖5
在一個(gè)Web應(yīng)用程序中,可以部署多個(gè)過(guò)濾器,這些過(guò)濾器組成一個(gè)過(guò)濾器鏈。過(guò)濾器鏈中的每個(gè)過(guò)濾器都有特定的操作,Web請(qǐng)求和響應(yīng)信息按照一定過(guò)濾器順序,在過(guò)濾器之間進(jìn)行傳遞。Web容器目標(biāo)資源過(guò)濾器1過(guò)濾器2過(guò)濾器n…客戶端瀏覽器請(qǐng)求響應(yīng)圖2多個(gè)過(guò)濾器組成的過(guò)濾器鏈6
FilterAPI
與過(guò)濾器開(kāi)發(fā)相關(guān)的接口和類包含在javax.servlet和javax.servlet.http包中,主要的接口和類如下:
(1)javax.servlet.Filter接口
該接口是過(guò)濾器必須要實(shí)現(xiàn)的接口,提供了過(guò)濾器生命周期中的基本方法。
(2)javax.servlet.FilterChain接口
該接口提供了對(duì)某一資源過(guò)濾請(qǐng)求調(diào)用鏈的視圖,過(guò)濾器對(duì)象可以使用該接口的對(duì)象。
7(3)javax.servlet.FilterConfig接口
該接口的對(duì)象為過(guò)濾器配置對(duì)象,其在初始化期間將信息傳遞給過(guò)濾器。
(4)javax.servlet.ServletRequestWrapper類
為ServletRequest接口的實(shí)現(xiàn)。
(5)javax.servlet.ServletResponseWrapper類
為ServletResponse接口的實(shí)現(xiàn)。
(6)javax.servlet.HttpServletRequestWrapper類
為HttpServletRequest接口的實(shí)現(xiàn)。
(7)javax.servlet.HttpServletReponseWrapper類
為HttpServletResponse接口的實(shí)現(xiàn)。8主要內(nèi)容過(guò)濾器(Filter)概述過(guò)濾器接口Filter接口FilterConfig接口FilterChain接口過(guò)濾器的創(chuàng)建與部署9(1)Filter接口
Filter接口是開(kāi)發(fā)過(guò)濾器必須要實(shí)現(xiàn)的接口,該接口定義了init(),doFilter(),destroy()三個(gè)方法。這3個(gè)方法分別對(duì)應(yīng)Servlet過(guò)濾器生命周期中的初始化、響應(yīng)和銷毀3個(gè)階段。
①publicvoidinit(FilterConfigconfig)throwsServletException
該方法為過(guò)濾器的初始化方法,只在實(shí)例化過(guò)濾器時(shí)才會(huì)被調(diào)用一次。其中,該方法參數(shù)為FilterConfig對(duì)象,包含了在部署描述符配置中的與過(guò)濾器相關(guān)的初始化參數(shù)。10②publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsjava.io.IOException,ServletException
該方法實(shí)現(xiàn)了過(guò)濾器對(duì)Web請(qǐng)求和響應(yīng)的操作功能,當(dāng)請(qǐng)求和響應(yīng)經(jīng)過(guò)過(guò)濾器時(shí),Web容器都要調(diào)用該方法doFilter()一次。
FilterChain參數(shù)對(duì)于正確的過(guò)濾器操作至關(guān)重要,為了將請(qǐng)求/響應(yīng)沿過(guò)濾器鏈繼續(xù)傳送,在每個(gè)過(guò)濾器的doFilter()方法中必須要調(diào)用FilterChain對(duì)象的doFilter()方法。11
在過(guò)濾器中處理的ServletRequest和ServletResponse對(duì)象,最終要傳遞到被過(guò)濾的Servlet或JSP,所以在doFilter()方法中可以通過(guò)對(duì)ServletRequest的操作來(lái)改變Web請(qǐng)求的頭信息,通過(guò)對(duì)ServletResponse的操作來(lái)改變響應(yīng)信息。任何出現(xiàn)在FilterChain的doFilter()方法之前的代碼都被看作預(yù)處理過(guò)濾器邏輯,在這一階段,可以對(duì)請(qǐng)求信息進(jìn)行修改,但不能修改響應(yīng)信息;12任何出現(xiàn)在FilterChain的doFilter()方法之后的代碼都被看作過(guò)濾器邏輯的后處理,在這一階段,可以對(duì)響應(yīng)信息進(jìn)行修改,但不能修改請(qǐng)求信息;③publicvoiddestroy()
調(diào)用destroy()方法表示過(guò)濾器生命周期結(jié)束,并且釋放過(guò)濾器使用的資源。FilterChain對(duì)象doFilter()過(guò)濾器邏輯的預(yù)處理過(guò)濾器邏輯的后處理可以修改請(qǐng)求信息可以修改響應(yīng)信息13(2)FilterConfig接口
FilterConfig接口包含以下的方法:
①publicStringgetFilterName()
獲得過(guò)濾器的名稱。②publicStringgetInitParameter(Stringname)
獲得過(guò)濾器的初始化字符串。③publicEnumerationgetInitParameterNames()
獲得過(guò)濾器初始化字符串的名稱。④publicServletContextgetServletContext()
獲得過(guò)濾器所在Web應(yīng)用的Servlet上下文對(duì)象引用。14(3)FilterChain接口
FilterChain接口僅定義了一個(gè)方法:
publicvoiddoFilter(ServletRequestreq,ServletResponseres)
該方法用于請(qǐng)求/響應(yīng)沿過(guò)濾器鏈向后傳送給下一個(gè)過(guò)濾器,如果調(diào)用該方法的過(guò)濾器是鏈中最后一個(gè),那么目標(biāo)資源將被調(diào)用。
因此,過(guò)濾器對(duì)象通過(guò)FilterChain對(duì)象調(diào)用過(guò)濾器鏈中的下一個(gè)過(guò)濾器或者調(diào)用目標(biāo)資源。15主要內(nèi)容過(guò)濾器(Filter)概述
FilterAPIFilter接口FilterConfig接口FilterChain接口
過(guò)濾器的創(chuàng)建與部署16創(chuàng)建過(guò)濾器類:17packagepack;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjava.io.PrintWriter;public
classTestFilterimplementsFilter{過(guò)濾器類18publicTestFilter(){//TODOAuto-generatedconstructorstub}publicvoiddestroy(){//TODOAuto-generatedmethodstub}publicvoidinit(FilterConfigfConfig)throwsServletException{//TODOAuto-generatedmethodstub}19
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("befordoFilter");chain.doFilter(request,response);out.println("afterdoFilter");out.close();}調(diào)用FilterChain對(duì)象20<%@pagelanguage="java"contentType="text/html;charset=gb2312"pageEncoding="gb2312"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"><title>Inserttitlehere</title></head><body>
Filter測(cè)試!</body></html>test.jsp(需要過(guò)濾的JSP頁(yè)面)21<filter>
<description>
</description>
<display-name>TestFilter</display-name>
<filter-name>TestFilter</filter-name>
<filter-class>pack.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>web.xml文檔如果是Servlet:<servlet-name>myServlet</servlet-name>22運(yùn)行結(jié)果:23說(shuō)明:在Web應(yīng)用程序中,經(jīng)常需要用戶在頁(yè)面中輸入一些數(shù)據(jù),用戶在將這些數(shù)據(jù)提交給Web服務(wù)器,由服務(wù)器端的程序進(jìn)行處理前,可以采用過(guò)濾器攔截客戶端的請(qǐng)求信息,獲得輸入?yún)?shù),對(duì)輸入?yún)?shù)的合法性進(jìn)行校驗(yàn)。
(1)實(shí)現(xiàn)3個(gè)JSP頁(yè)面:
FormCheck.jsp;FormSuccess.jsp;
FormFail.jsp
(2)實(shí)現(xiàn)一個(gè)過(guò)濾器:FormFilter.java
例:應(yīng)用過(guò)濾器對(duì)頁(yè)面表單數(shù)據(jù)進(jìn)行校驗(yàn)24FormCheck.jsp:<body><h2>使用過(guò)濾器校驗(yàn)表單數(shù)據(jù):</h2><formmethod="post"
action="FormSuccess.jsp"><table><tr><td>姓名:</td><td><inputname="name"type="text"></td></tr><tr><td>年齡:</td><td><inputname="age"type="text"></td></tr><tr><td></td>
25<td><inputname="submit"type="submit"value="提交"><inputname="reset"type="reset"value="重置"></td></tr></table></form></body>26FormSuccess.jsp:<body><h2>您提交的數(shù)據(jù):</h2><form><table><tr><td>姓名:</td><td><inputname="name"type="text"
value=<%=request.getParameter("name")%>
readonly="true"></td></tr><tr>27<td>年齡:</td><td><inputname="age"type="text"
value=<%=request.getParameter("age")%>readonly="true"></td></tr></table></form>
<h2><fontcolor="#FF0000">數(shù)據(jù)成功通過(guò)了過(guò)濾器校驗(yàn)!</font></h2></body>28FormFail.jsp:<body><h2>您提交的數(shù)據(jù)如下:</h2><form><table><tr><td>姓名:</td><td><inputname="name"type="text"
value=<%=request.getParameter("name")%>readonly="true"></td></tr><tr>29<td>年齡:</td><td>
<inputname="age"type="text"value=<%=request.getParameter("age")%>readonly="true"></td></tr></table></form>
<h2><fontcolor="#0000EE">輸入數(shù)據(jù)沒(méi)能通過(guò)過(guò)濾器的校驗(yàn)!</font></h2></body>30FormFilter.java:packagepack;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.*;public
class
FormFilter
implementsFilter{31publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{
Stringname=request.getParameter("name");
StringstrAge=request.getParameter("age");
intage;
RequestDispatcherdispatcher=
request.getRequestDispatcher("FormFail.jsp");
該對(duì)象包裝位于特定路徑上的服務(wù)器資源32if(name==null||strAge=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軟聚氯乙烯粒料項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)酒瓶保護(hù)器行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年紫銅螺紋電極項(xiàng)目可行性研究報(bào)告
- 2025年甲硫酸鈉項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)淋浴座椅行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)木制門行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年推騎小轎車項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)吸污口行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年雙盆落地直飲水臺(tái)項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)ABS再生造粒行業(yè)投資前景及策略咨詢研究報(bào)告
- 骨科的疼痛管理
- 前列腺癌診斷治療指南
- 中國(guó)銀行招聘筆試真題「英語(yǔ)」
- 江蘇省2023年對(duì)口單招英語(yǔ)試卷及答案
- GB/T 35506-2017三氟乙酸乙酯(ETFA)
- GB/T 25784-20102,4,6-三硝基苯酚(苦味酸)
- 特種設(shè)備安全監(jiān)察指令書填寫規(guī)范(特種設(shè)備安全法)參考范本
- 《長(zhǎng)方形的面積》-完整版課件
- 五年級(jí)上冊(cè)英語(yǔ)Module6Unit1Youcanplaybasketballwell外研社課件
- 工業(yè)企業(yè)現(xiàn)場(chǎng)監(jiān)測(cè)工況核查表
- 沉淀池及排水溝清理記錄表
評(píng)論
0/150
提交評(píng)論