过滤器

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

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

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. AWS CSAA -- 02 AWS - 10000 Feet Overview

    004 The History Of AWS So Far 005 AWS - 10000 Foot Overview 006 AWS - 10000 Foot Overview 007 AWS - ...

  2. springMVC入门-02

    本节会在上节基础上讨论springMVC如何传值的问题. 在添加dispatcherServlet之后,拦截器会将url中的参数拦截下来,使之可以在controller中使用.以下代码就是在前台输入u ...

  3. The operation names in the portType match the method names in the SEI or Web service implementation class.

    The Endpoint validation failed to validate due to the following errors: :: Invalid Endpoint Interfac ...

  4. 连接AWS Ubuntu服务器

    1.在AWS上创建了Ubuntu实例后,在实例里点连接.点使用PuTTY连接,下载PuTTY软件. 2.在所有程序里找到PuTTYgen并打开,点Load选择创建实例时的pem文件,点save pri ...

  5. 记开发个人图书收藏清单小程序开发(七)DB设计

    前面的书房初始化的前端信息已经完善,所以现在开始实现DB的Script部分. 新增Action:Shelf_Init.sql svc.sql CREATE SCHEMA [svc] AUTHORIZA ...

  6. 我们是如何拿下Google和Facebook Offer的?

    http://posts.careerengine.us/p/57c3a1c1a09633ee7e57803c 大家好,我是小高,CMU CS Master,来Offer第一期学员,2014年初在孙老 ...

  7. eclipse缓慢了么?

    我的eclipse突然变得无比缓慢,javaw.exe的cpu使用率高达85%! 可是我什么也没做啊.项目组的其他同事询问过后,也没有谁修改了eclipse的配置文件(.setting文件夹  .cl ...

  8. here i am(歌手BryanAdams的歌曲)

    here i am(歌手BryanAdams的歌曲) 编辑 目录 1歌曲信息 2中英文歌词 1歌曲信息编辑 1. 歌手:Bryan Adams 布莱恩·亚当斯 生日:1959年11月5日 星座:天蝎座 ...

  9. Keepalived 实现双机热备

    原理 首先有一个虚拟ip暴露给客户端,虚拟ip对应的mac地址为一台真实服务器, 即用户向虚拟ip发送一个请求,该请求会被分发到真实服务器上. 现在有2台真实服务器,一台master,一台backup ...

  10. adb shell 运行时报错"adb server version (26) doesn't match this client (39); killing..."的解决方案

    adb即 Android Debug Bridge 是一个通用的命令行工具,可用于通过PC端对连接的Android模拟器设备或连接至电脑的真实物理设备进行命令行操作.目前,许多软件均会借助 adb 工 ...