`

初识servlet中过滤器

阅读更多

对于Web应用程序来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端与资源之间的请求与相应信息,并对这些信息进行过滤

执行顺序是:当Web服务器接收到对资源文件的请求时,先判断是否有与该资源文件关联的过滤器,如果有,那么容器讲请求先交个过滤器进行处理,过滤器处理完后再转交给目标资源。当目标资源对请求作出响应时,容器同样会将响应先交给过滤器处理,最后再将响应发给客户端。

当部署了多个过滤器时就组成了过滤器链,过滤器依次对请求做处理,交给目标资源,然后再按照相反的顺序处理响应信息,直到客户端。

过滤器并不是必须将请求交给目标资源或下一个过滤器,它可以自行处理请求,然后发送响应到客户端,或者将请求交给另一个目标资源。

与过滤器相关的接口和类主要有以下几个:

 

具体各类解释可参考j2ee api(简单记载以下,通过继承HttpServletRequestWrapper类可以重写getParameter方法,从而可以对请求的参数做一些特殊处理,通过继承HttpServletResponseWrapper类可以将响应流暂时存放到内存中,从而对响应留做一些替换处理后再发送到浏览器显示)

Servlet容器对部署描述符中声明的每一个过滤器只会创建一个实例。与Servlet类似,容器将在同一个过滤器实例上运行多个线程同时为多个请求服务,因此开发过滤器时也要注意线程安全问题。

<filter-mapping>中可以包含0到4个<dispatcher>元素,该元素指定过滤器对应的请求方式,可以使REQUESR、Include、Forward和Error四种之一,默认为Request(如果目标资源是通过RequestDispatcher的include或forward方法访问时,那么该过滤器不被调用)。

以下由一个例子来解释过滤器和目标资源之间的处理顺序:

a.jsp

<%
     response.sendRedirect("b.jsp");
     System.out.println(3);
%>

b.jsp

<%
	System.out.println(4);
%>

myfilter

System.out.println(1);
chain.doFilter(request,response);
System.out.println(2);

web.xml中对调用a、b页面都设置了过滤器(默认request模式)

当在浏览器中输入对a.jsp的访问地址后,后台打印顺序是1、3、2、1、4、2

这里涉及到sendRedirect的原理了,它其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面(用sendRedirect时浏览器的地址栏上可以看到地址的变化。而用jsp:forword则不会),也就是说sendRedirect相当于浏览器又向服务器发送了一个新的请求,那么就不难理解为何打印书序如上了。 

这里,我们将a.jsp改为如下

<%
     //response.sendRedirect("b.jsp");
     System.out.println(3);
%>
<jsp:forward   page="b.jsp"/>

 这样一来打印顺序就变了1、3、1、4、2、2。

为什么会这样呢?同样要从jsp:forward的实现原理来分析,sendRedirect方式相当于浏览器接收到了响应之后又向服务器发送了一次请求,所以相当于两次请求,而jsp:forward方式则相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,最本质的特点就是两次请求共享了reques对象和response对象

0
0
分享到:
评论

相关推荐

    Struts2之Servlet API及单元测试初识案例struts005

    1. **过滤器(Filter)**:Struts2的核心过滤器`StrutsPrepareAndExecuteFilter`负责初始化Action上下文,处理请求并执行Action。它会解析请求参数,根据配置文件确定Action,然后调用Action的execute方法。 2. **...

    HelloWorld1_初识javaee_

    6. **部署描述符(web.xml)**:这是JavaEE Web应用的配置文件,定义了Servlet、过滤器、监听器等组件及其行为。 7. **WAR文件**:JavaEE Web应用被打包成WAR(Web ARchive)文件进行部署,"HelloWorld1"项目可能...

    初识 Struts2 第一节

    - **FilterDispatcher**: Struts2的核心组件,作为Servlet过滤器实现请求的分发。 - **Action**: 表现层的入口,负责处理业务逻辑并返回结果。 - **Interceptor**: 拦截器是Struts2的一大特色,它们按顺序执行,可以...

    初识 Spring Security - v1.1.pdf

    **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架能够在Web请求级别以及方法调用级别处理身份验证...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    5.4 一夫当关——配置并应用Servlet过滤器 5.4.1 过滤器的基本原理 5.4.2 过滤器的核心API 5.4.3 过滤器的创建与配置 5.4.4 JavaWeb中字符乱码分析 5.4.5 实现字符编码过滤器 5.5 实战检验 5.5.1 通过Servlet实现...

    精通JSP-Web开发技术与典型应用 光盘代码

    \ch12\* 第12章 使用Servlet2.4过滤器和监听器所有例程代码 \ch13\* 第13章 数据库访问:JDBC所有例程代码 \ch14\* 第14章 用户注册登录模块所有例程代码 \ch15\* 第15章 购物车模块所有例程代码 \ch16\* 第16...

    STRUTS基础

    另一个是web.xml,用于配置ActionServlet和过滤器。 5. **ActionForm**:ActionForm是Struts中处理表单数据的类,它通常与JSP页面中的表单元素相对应,负责收集和验证用户输入的数据。 6. **Tiles**:Struts的...

    Beginning_Java_EE_5_From_Novice_to_Professional-39_beginning jav

    书中会详细介绍Servlet的生命周期、配置、过滤器和监听器。 3. **JSP**:JSP是用于创建动态网页的工具,书中将探讨JSP的指令、脚本元素、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library...

    Beginning_Java_EE_6_Platform_with_GlassFish

    在Java EE 6中,Servlet 3.0引入了异步处理、过滤器链等新特性,增强了性能和灵活性。 2. JavaServer Faces(JSF):JSF是一个MVC(Model-View-Controller)框架,简化了创建用户界面的过程。在Java EE 6中,JSF ...

    JAVA程序开发大全---上半部分

    20.10.2 将用户评论信息插入到数据库中的Servlet类Comment 381 20.11 后台管理模块的实现 384 20.11.1 后台管理模块的用户登录页面index.jsp 384 20.11.2 后台管理模块的首页面default.jsp 385 20.11.3 输入要添加的...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    1.3 带过滤器调度程序的Model 2 9 1.4 小结 13 第2章 初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件...

    深入浅出Struts2(附源码)

    1.3 带过滤器调度程序的Model 2 9 1.4 小结 13 第2章初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts....

    Stripes 快速入门 pdf 中文版 下载

    - **组件模型**:Struts 1基于Servlet生命周期模型,而Stripes采用了更为灵活的组件模型,使得ActionBean可以更好地封装业务逻辑。 - **灵活性**:Stripes提供了更强大的灵活性,支持动态类型转换、数据验证等功能,...

Global site tag (gtag.js) - Google Analytics