版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
JavaWeb程序設(shè)計
——Servlet編程(3)2主要內(nèi)容過濾器(Filter)概述
FilterAPIFilter接口FilterConfig接口FilterChain接口過濾器的創(chuàng)建與部署3過濾器(Filter)概述
在Web應(yīng)用程序中,過濾器位于服務(wù)器端,在客戶端和服務(wù)器端資源之間過濾請求和響應(yīng)數(shù)據(jù)。過濾器(Filters)是在Servlet2.3規(guī)范中引入的新功能,并在Servlet2.4規(guī)范中得到增強。過濾器是一種Web組件,它們攔截請求和響應(yīng),以查看、提取或以某種方式操作客戶機和服務(wù)器之間交換的數(shù)據(jù)。
4
對于Web應(yīng)用,過濾器是駐留在服務(wù)器端,對Web請求和Web響應(yīng)的頭屬性(Header)和內(nèi)容體(Body)進行操作的一種特殊Web組件。如下圖所示:
客戶端瀏覽器Web容器目標(biāo)資源過濾器請求響應(yīng)圖1過濾器示意圖5
在一個Web應(yīng)用程序中,可以部署多個過濾器,這些過濾器組成一個過濾器鏈。過濾器鏈中的每個過濾器都有特定的操作,Web請求和響應(yīng)信息按照一定過濾器順序,在過濾器之間進行傳遞。Web容器目標(biāo)資源過濾器1過濾器2過濾器n…客戶端瀏覽器請求響應(yīng)圖2多個過濾器組成的過濾器鏈6
FilterAPI
與過濾器開發(fā)相關(guān)的接口和類包含在javax.servlet和javax.servlet.http包中,主要的接口和類如下:
(1)javax.servlet.Filter接口
該接口是過濾器必須要實現(xiàn)的接口,提供了過濾器生命周期中的基本方法。
(2)javax.servlet.FilterChain接口
該接口提供了對某一資源過濾請求調(diào)用鏈的視圖,過濾器對象可以使用該接口的對象。
7(3)javax.servlet.FilterConfig接口
該接口的對象為過濾器配置對象,其在初始化期間將信息傳遞給過濾器。
(4)javax.servlet.ServletRequestWrapper類
為ServletRequest接口的實現(xiàn)。
(5)javax.servlet.ServletResponseWrapper類
為ServletResponse接口的實現(xiàn)。
(6)javax.servlet.HttpServletRequestWrapper類
為HttpServletRequest接口的實現(xiàn)。
(7)javax.servlet.HttpServletReponseWrapper類
為HttpServletResponse接口的實現(xiàn)。8主要內(nèi)容過濾器(Filter)概述過濾器接口Filter接口FilterConfig接口FilterChain接口過濾器的創(chuàng)建與部署9(1)Filter接口
Filter接口是開發(fā)過濾器必須要實現(xiàn)的接口,該接口定義了init(),doFilter(),destroy()三個方法。這3個方法分別對應(yīng)Servlet過濾器生命周期中的初始化、響應(yīng)和銷毀3個階段。
①publicvoidinit(FilterConfigconfig)throwsServletException
該方法為過濾器的初始化方法,只在實例化過濾器時才會被調(diào)用一次。其中,該方法參數(shù)為FilterConfig對象,包含了在部署描述符配置中的與過濾器相關(guān)的初始化參數(shù)。10②publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsjava.io.IOException,ServletException
該方法實現(xiàn)了過濾器對Web請求和響應(yīng)的操作功能,當(dāng)請求和響應(yīng)經(jīng)過過濾器時,Web容器都要調(diào)用該方法doFilter()一次。
FilterChain參數(shù)對于正確的過濾器操作至關(guān)重要,為了將請求/響應(yīng)沿過濾器鏈繼續(xù)傳送,在每個過濾器的doFilter()方法中必須要調(diào)用FilterChain對象的doFilter()方法。11
在過濾器中處理的ServletRequest和ServletResponse對象,最終要傳遞到被過濾的Servlet或JSP,所以在doFilter()方法中可以通過對ServletRequest的操作來改變Web請求的頭信息,通過對ServletResponse的操作來改變響應(yīng)信息。任何出現(xiàn)在FilterChain的doFilter()方法之前的代碼都被看作預(yù)處理過濾器邏輯,在這一階段,可以對請求信息進行修改,但不能修改響應(yīng)信息;12任何出現(xiàn)在FilterChain的doFilter()方法之后的代碼都被看作過濾器邏輯的后處理,在這一階段,可以對響應(yīng)信息進行修改,但不能修改請求信息;③publicvoiddestroy()
調(diào)用destroy()方法表示過濾器生命周期結(jié)束,并且釋放過濾器使用的資源。FilterChain對象doFilter()過濾器邏輯的預(yù)處理過濾器邏輯的后處理可以修改請求信息可以修改響應(yīng)信息13(2)FilterConfig接口
FilterConfig接口包含以下的方法:
①publicStringgetFilterName()
獲得過濾器的名稱。②publicStringgetInitParameter(Stringname)
獲得過濾器的初始化字符串。③publicEnumerationgetInitParameterNames()
獲得過濾器初始化字符串的名稱。④publicServletContextgetServletContext()
獲得過濾器所在Web應(yīng)用的Servlet上下文對象引用。14(3)FilterChain接口
FilterChain接口僅定義了一個方法:
publicvoiddoFilter(ServletRequestreq,ServletResponseres)
該方法用于請求/響應(yīng)沿過濾器鏈向后傳送給下一個過濾器,如果調(diào)用該方法的過濾器是鏈中最后一個,那么目標(biāo)資源將被調(diào)用。
因此,過濾器對象通過FilterChain對象調(diào)用過濾器鏈中的下一個過濾器或者調(diào)用目標(biāo)資源。15主要內(nèi)容過濾器(Filter)概述
FilterAPIFilter接口FilterConfig接口FilterChain接口
過濾器的創(chuàng)建與部署16創(chuàng)建過濾器類: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{過濾器類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對象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測試!</body></html>test.jsp(需要過濾的JSP頁面)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運行結(jié)果:23說明:在Web應(yīng)用程序中,經(jīng)常需要用戶在頁面中輸入一些數(shù)據(jù),用戶在將這些數(shù)據(jù)提交給Web服務(wù)器,由服務(wù)器端的程序進行處理前,可以采用過濾器攔截客戶端的請求信息,獲得輸入?yún)?shù),對輸入?yún)?shù)的合法性進行校驗。
(1)實現(xiàn)3個JSP頁面:
FormCheck.jsp;FormSuccess.jsp;
FormFail.jsp
(2)實現(xiàn)一個過濾器:FormFilter.java
例:應(yīng)用過濾器對頁面表單數(shù)據(jù)進行校驗24FormCheck.jsp:<body><h2>使用過濾器校驗表單數(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ù)成功通過了過濾器校驗!</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ù)沒能通過過濾器的校驗!</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");
該對象包裝位于特定路徑上的服務(wù)器資源32if(name==null||strAge=
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年體育賽事贊助合同詳細(xì)條款與權(quán)益分配3篇
- 2025年度跨國公司美金貸款合同
- 二零二五年度水稻種植基地建設(shè)合同
- 2025版離婚協(xié)議書范本:房產(chǎn)買賣合同分割及處理細(xì)則4篇
- 2025年度脫硫石膏復(fù)合材料銷售協(xié)議3篇
- 2025年冰箱洗衣機節(jié)能補貼項目合作協(xié)議3篇
- 2025年度離婚協(xié)議書:陳飛與劉婷離婚財產(chǎn)分割及子女撫養(yǎng)費協(xié)議4篇
- 二零二五年度老舊小區(qū)消防隱患排查與整改承包合同2篇
- 二零二四云存儲服務(wù)與云原生應(yīng)用部署合同3篇
- 貨物運輸協(xié)議
- ICU常見藥物課件
- CNAS實驗室評審不符合項整改報告
- 農(nóng)民工考勤表(模板)
- 承臺混凝土施工技術(shù)交底
- 臥床患者更換床單-軸線翻身
- 計量基礎(chǔ)知識培訓(xùn)教材201309
- 中考英語 短文填詞、選詞填空練習(xí)
- 一汽集團及各合資公司組織架構(gòu)
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 初一至初三數(shù)學(xué)全部知識點
- 新課程理念下的班主任工作藝術(shù)
評論
0/150
提交評論