过滤器

- 一个中间组件,用于拦截源数据和目的数据之间的消息

- 过滤二者之间传递的数据

Web应用上的过滤器

-驻留在Web服务器上的Web组件

-过滤从客户端传递到服务器端的请求和响应

单个过滤器

  当Web容器接收到一个对资源的请求时,它将判断是否有过滤器器与这个资源相关联,如果有那么容器就把请求交给过滤器进行处理。在过滤器中,我们可以更改请求的内容,或者重新设置请求头,然后再将请求传递给目标资源。当目标资源对请求做出响应时,容器同样会将响应转发给过滤器,在过滤器中,我们可以对响应的内容进行更改,然后将响应发送回客户端。在Web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,他们并不需要知道过滤器的存在。

Web应用上部署多个过滤器

过滤器链

  过滤器可以组成一个过滤器链。链中的每个过滤器负责特定的操作和任务,客户端的请求和响应在这些过滤器之间传递

  过滤器的一些常见应用:

- 认证过滤:对用户请求进行统一的认证。

- 登录和审核过滤:对用户的访问请求进行记录和审核。

- 图像转换过滤:转换图像格式。

- 数据压缩过滤 :对用户发生的数据进行压缩,从而减少传输量。

- 加密过滤:对请求和响应进行加密解密处理。

- 令牌过滤

- 资源访问触发事件过滤

- XSLT过滤

- MIME-type过滤

 Servlet的编码、编译、部署

  - 编码

    所有的过滤器必须实现javax.serlvet.Filter接口。实现Filter接口中定义的三个方法init()、doFilter()、destroy()。

  - 编译

    添加Servlet.jar包到工程jar包目录下。

  - 部署

    将编译好的class文件放置在Web应用程序的classes目录下

    在部署文件web.xml中添加过滤器的注册与映射

<!--指定过滤器名和过滤器类-->
<filter>
<filter-name>HelloWorldFilter</filter-name>
<filter-class>com.lovobook.HelloWorldFilter</filter-class>
</filter>
<!-- 将过滤器与URL模式关联-->
<filter-mapping>
<filter-name>HelloWorldFilter</filter-name>
<url-pattern>/filter/*</url-pattern>
</filter-mapping>

过滤器API

  由容器实现的接口

- javax.servlet.Filter

- javax.servlet.FilterChain

- javax.servlet.FilterConfig

  四个包装器类

- javax.servlet.ServletRequestWrapper

- javax.servlet.ServletResponseWrapper

- javax.servlet.http.HttpServletRequestWrapper

- javax.servlet.http.HttpServletResponseWrapper

Filter接口

方法

描述

void init(FilterConfig)

在应用程序启动时,由容器调用

Void doFilter(ServletRequest, ServletResponse, FilterChain)

对于每个URL映射到该过滤器的请求,由容器调用该方法。

void destroy()

在应用程序关闭时,由容器调用。

- 过滤器的生命周期方法 ,过滤器API不提供Filter接口的任何实现 。自定义的过滤器必须明确地实现所有三个方法

- 容器仅调用过滤器实例的init()方法一次。在init()方法没有执行完前,容器不会转发任何请求到过滤器

- doFilter()方法给过滤器对象一个机会来处理请求,转发请求到过滤器链中的下一个组件,或者自己回复客户端

- destroy()是过滤器最后一个方法来调用,以指示过滤器生命周期的结束

FilterConfig接口

- 为过滤器提供初始化参数,并将对象作为参数传递给过滤器的init()方法

- 提供了一个过滤器所在的应用程序ServletContext的应用

- 由Servlet容器实现

方法

描述

String getFilterName()

返回在部署描述文件中指定的过滤器的名称

String getInitParameter(String)

返回在部署描述文件中指定的参数的值

Enumeration getInitParameterNames()

返回在部署描述文件中指定的所有参数的名称。

ServletContext getServletContext()

返回Web应用程序的ServletContext。过滤器可以使用ServletContext设置、获取application范围内的属性。

FilterChain接口

- 由容器实现,由容器将其实例作为参数传到Filter接口的doFilter()方法

- 将请求传递到过滤器链的下一个组件

方法

描述

Void doFilter(ServletRequest, ServletResponse)

我们从一个过滤器对象的doFilter()方法中调用此方法,以继续过滤器链的传递过程。它会将控制转到链中的下一个组件。

配置Filter

  <filter>元素

元素层次图

<filter>
<filter-name>ValidatorFilter</filter-name>
<description>Validates the requests</description>
<!--文件路径-->
<filter-class>com.lovobook.filters.ValidatorFilter</filter-class>
<!--初始参数-->
<init-param>
<param-name>locale</param-name>
<param-value>USA</param-value>
</init-param>
</filter>

  <filter-mapping>元素

Filter-mapping结构图

<!--所有匹配到该URL定义的请求,都要被filter-name中定义的过滤器过滤。-->
<filter-mapping>
<filter-name>ValidatorFilter</filter-name>
<url-pattern>*.doc</url-pattern>
</filter-mapping>
<!--servlet-name用于定义一个servlet名,所有对该servlet的访问都要被filter-name中定义的过滤器过滤 -->
<filter-mapping>
<filter-name>ValidatorFilter</filter-name>
<servlet-name>reportServlet</servlet-name>
</filter-mapping>

配置过滤器链

- 用多个过滤器处理在同一个请求

- 使用多个<filter-mapping>元素配置过滤器链

- 首先调用匹配请求URI的过滤器<url-pattern>

- 再查找用Servlet名匹配请求URI的所有过滤器<servlet-name>

- 过滤器的顺序按照它们在部署描述文件中出现的顺序排序

<filter-mapping>
<filter-name>FilterA</filter-name>
<servlet-name>RedServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>FilterB</filter-name>
<url-pattern>*.red</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>RedServlet</servlet-name>
<url-pattern>*.red</url-pattern>
</servlet-mapping>
<!--FilterA先执行?还是FilterB先执行?
容器会先调用匹配请求URI的过滤器,然后才是匹配servlet名的过滤器。因此,FilterB始终在FilterA之前调用-->

使用请求和响应包装器

- 所有的四个包装器类(包括ServletRequestWrapper、ServletResponseWrapper  、HttpServletRequestWrapper、HttpServletResponseWrapper的工作方式基本相同)。这四个类在其构造器中用request或response对象作为参数,并代理对两个对象的所有方法的调用。这样就运行我们扩充这些类,并使用自定义的行为覆盖类的方法

- 在请求送到过滤器链的下一个组件之前更改请求的内容

- 改变从前一个组件接收的响应

public class MyRequestWrapper extends HttpServletRequestWrapper {
public MyRequestWrapper(HttpServletRequest req) {
super(req);
}
//重写接口方法
……
} public class MyResponseWrapper extends HttpServletResponseWrapper {
public MyResponseWrapper(HttpServletResponse response) {
super(response);
}
……
} public class TextToHTMLFilter implements Filter {
……
public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) …{
MyRequestWrapper mrw = new MyRequestWrapper (req);
MyResponseWrapper mrsw = new MyResponseWrapper(res);
filterChain.doFilter(mrw , mrsw );
}
}

JavaWeb总结(九)的更多相关文章

  1. JavaWeb总结(九)—过滤器

    一.Filter简介 Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:JSP.Servlet.静态文件.静态HTML等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限 ...

  2. JavaWeb 后端 <九> 之 JDBC加强

    一.大结果集的分页(重点,难点) 1.分批次查询:分页 2.基于数据库的分页:依赖的是数据库的分页语句(不同数据库是不同的) MySQL:每页显示10条. select * from XXX limi ...

  3. JavaWeb(九)AJAX

    Ajax ajax:AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新 AJAX:Asynchronous JavaScript and XML,异步 javasc ...

  4. JavaWeb学习 (九)————HttpServletRequest对象(一)

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  5. javaweb(十九)——JSP标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  6. JavaWeb 11_jsp九大内置对象

    1. out: 输出对象,向客户端输出内容2. request: 请求对象;存储"客户端向服务端发送的请求信息" request对象的常见方法: String getParamet ...

  7. javaWEB总结(12):JSP页面的九个隐含对象

    前言 jsp本质上是一个servlet,而在jsp中有九个不用声明就可以使用的对象,我们叫他隐含对象.本文基于上文所写,如有需要可查看上一篇文章javaWEB总结(11):JSP简介及原理. 打开上次 ...

  8. Javaweb学习随笔_JSP的九大内置对象

    JSP内置对象整理 1. 九大内置对象: out,request,response,session,application,page,pageContext,config,Exception. 1.1 ...

  9. JavaWeb学习总结(十七)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  10. javaWeb学习总结(8)- JSP中的九个内置对象(4)

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

随机推荐

  1. Java设计模式----初识适配器模式

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. leveldb源码分析--Key结构

    [注]本文参考了sparkliang的专栏的Leveldb源码分析--3并进行了一定的重组和排版 经过上一篇文章的分析我们队leveldb的插入流程有了一定的认识,而该文设计最多的又是Batch的概念 ...

  3. ExpressRoute 先决条件和清单

    若要使用 ExpressRoute 连接到 Azure 服务,需确认是否符合以下部分中所列的要求. 帐户要求 使用中的有效 Azure 帐户.需有此帐户才能设置 ExpressRoute 线路. 连接 ...

  4. 从Azure上构建Linux应用程序映像

    下图描述了总体的虚拟机的VHD映像生成以及发布到 Azure Azure 镜像市场的全过程: 具体步骤如下: 从Azure管理平台上Linux申请虚拟机, 安装和配置您要发布的应用软件产品,制作成映像 ...

  5. [WinCE] Can't find P/Invoke DLL sqlceme35.dll

    找到目录: C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i 将 sqlce ...

  6. 从MySQL向Greenplum集群中导入数据

    我们要从MySQL当中导出数据到Greenplum当中,按照以下步骤就可以 1:将MySQL当中的表导出外部文件 以schema_name.table_name为例 select product_id ...

  7. 如何让chrome浏览器自动翻译

    我用的chrome浏览器,最初用的时候浏览器默认自动翻译英文,我感觉很麻烦.所以我选择了一律不翻译.但是我当我想翻译的的时候又不知道怎么操作.一直郁闷到现在.今天我突然发现了一个方法可以让你的浏览器自 ...

  8. 铁乐学python_Day44_IO多路复用

    目录 IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO ...

  9. Visual Studio 2013 Web开发新特性

    微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Server 2013. ...

  10. python第十四课--排序及自定义函数之自定义函数(案例二)

    案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...