Java Web程序开发与分析课件:Servlet编程(三)_第1页
Java Web程序开发与分析课件:Servlet编程(三)_第2页
Java Web程序开发与分析课件:Servlet编程(三)_第3页
Java Web程序开发与分析课件:Servlet编程(三)_第4页
Java Web程序开发与分析课件:Servlet编程(三)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb程序设计

——Servlet编程(3)2主要内容过滤器(Filter)概述

FilterAPIFilter接口FilterConfig接口FilterChain接口过滤器的创建与部署3过滤器(Filter)概述

在Web应用程序中,过滤器位于服务器端,在客户端和服务器端资源之间过滤请求和响应数据。过滤器(Filters)是在Servlet2.3规范中引入的新功能,并在Servlet2.4规范中得到增强。过滤器是一种Web组件,它们拦截请求和响应,以查看、提取或以某种方式操作客户机和服务器之间交换的数据。

4

对于Web应用,过滤器是驻留在服务器端,对Web请求和Web响应的头属性(Header)和内容体(Body)进行操作的一种特殊Web组件。如下图所示:

客户端浏览器Web容器目标资源过滤器请求响应图1过滤器示意图5

在一个Web应用程序中,可以部署多个过滤器,这些过滤器组成一个过滤器链。过滤器链中的每个过滤器都有特定的操作,Web请求和响应信息按照一定过滤器顺序,在过滤器之间进行传递。Web容器目标资源过滤器1过滤器2过滤器n…客户端浏览器请求响应图2多个过滤器组成的过滤器链6

FilterAPI

与过滤器开发相关的接口和类包含在javax.servlet和javax.servlet.http包中,主要的接口和类如下:

(1)javax.servlet.Filter接口

该接口是过滤器必须要实现的接口,提供了过滤器生命周期中的基本方法。

(2)javax.servlet.FilterChain接口

该接口提供了对某一资源过滤请求调用链的视图,过滤器对象可以使用该接口的对象。

7(3)javax.servlet.FilterConfig接口

该接口的对象为过滤器配置对象,其在初始化期间将信息传递给过滤器。

(4)javax.servlet.ServletRequestWrapper类

为ServletRequest接口的实现。

(5)javax.servlet.ServletResponseWrapper类

为ServletResponse接口的实现。

(6)javax.servlet.HttpServletRequestWrapper类

为HttpServletRequest接口的实现。

(7)javax.servlet.HttpServletReponseWrapper类

为HttpServletResponse接口的实现。8主要内容过滤器(Filter)概述过滤器接口Filter接口FilterConfig接口FilterChain接口过滤器的创建与部署9(1)Filter接口

Filter接口是开发过滤器必须要实现的接口,该接口定义了init(),doFilter(),destroy()三个方法。这3个方法分别对应Servlet过滤器生命周期中的初始化、响应和销毁3个阶段。

①publicvoidinit(FilterConfigconfig)throwsServletException

该方法为过滤器的初始化方法,只在实例化过滤器时才会被调用一次。其中,该方法参数为FilterConfig对象,包含了在部署描述符配置中的与过滤器相关的初始化参数。10②publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsjava.io.IOException,ServletException

该方法实现了过滤器对Web请求和响应的操作功能,当请求和响应经过过滤器时,Web容器都要调用该方法doFilter()一次。

FilterChain参数对于正确的过滤器操作至关重要,为了将请求/响应沿过滤器链继续传送,在每个过滤器的doFilter()方法中必须要调用FilterChain对象的doFilter()方法。11

在过滤器中处理的ServletRequest和ServletResponse对象,最终要传递到被过滤的Servlet或JSP,所以在doFilter()方法中可以通过对ServletRequest的操作来改变Web请求的头信息,通过对ServletResponse的操作来改变响应信息。任何出现在FilterChain的doFilter()方法之前的代码都被看作预处理过滤器逻辑,在这一阶段,可以对请求信息进行修改,但不能修改响应信息;12任何出现在FilterChain的doFilter()方法之后的代码都被看作过滤器逻辑的后处理,在这一阶段,可以对响应信息进行修改,但不能修改请求信息;③publicvoiddestroy()

调用destroy()方法表示过滤器生命周期结束,并且释放过滤器使用的资源。FilterChain对象doFilter()过滤器逻辑的预处理过滤器逻辑的后处理可以修改请求信息可以修改响应信息13(2)FilterConfig接口

FilterConfig接口包含以下的方法:

①publicStringgetFilterName()

获得过滤器的名称。②publicStringgetInitParameter(Stringname)

获得过滤器的初始化字符串。③publicEnumerationgetInitParameterNames()

获得过滤器初始化字符串的名称。④publicServletContextgetServletContext()

获得过滤器所在Web应用的Servlet上下文对象引用。14(3)FilterChain接口

FilterChain接口仅定义了一个方法:

publicvoiddoFilter(ServletRequestreq,ServletResponseres)

该方法用于请求/响应沿过滤器链向后传送给下一个过滤器,如果调用该方法的过滤器是链中最后一个,那么目标资源将被调用。

因此,过滤器对象通过FilterChain对象调用过滤器链中的下一个过滤器或者调用目标资源。15主要内容过滤器(Filter)概述

FilterAPIFilter接口FilterConfig接口FilterChain接口

过滤器的创建与部署16创建过滤器类: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();}调用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运行结果:23说明:在Web应用程序中,经常需要用户在页面中输入一些数据,用户在将这些数据提交给Web服务器,由服务器端的程序进行处理前,可以采用过滤器拦截客户端的请求信息,获得输入参数,对输入参数的合法性进行校验。

(1)实现3个JSP页面:

FormCheck.jsp;FormSuccess.jsp;

FormFail.jsp

(2)实现一个过滤器:FormFilter.java

例:应用过滤器对页面表单数据进行校验24FormCheck.jsp:<body><h2>使用过滤器校验表单数据:</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>您提交的数据:</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">数据成功通过了过滤器校验!</font></h2></body>28FormFail.jsp:<body><h2>您提交的数据如下:</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">输入数据没能通过过滤器的校验!</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");

该对象包装位于特定路径上的服务器资源32if(name==null||strAge=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论