过滤器与包装器

  过滤器允许你拦截请求,也允许你控制响应。Filter很像Servlet,容器管理过滤器的生命周期。和Servlet类似,过滤器也有init()和destroy()方法,对应于servlet的doGet()/doPost(),过滤器则有一个doFilter()方法。过滤器也需要在DD中声明,过滤器的运行顺序也将在DD中声明。

1.过滤器中的生命周期

  首先要有一个inti(),最常见的实现是在inti()中保存一个FilterConfig的引用,以备过滤器以后使用(获取过滤器参数等)。

  真正的工作在doFilter()中完成。doFilter方法有3个参数:

一个ServletRequest(不是HttpServletRequest);

一个ServletResponse(不是HttpServletResponse);

一个FilterChain,过滤器并不知道请求所涉及的其他过滤器,但是必须有人知道过滤器执行的顺序,这个人就是FilterChain,它由DD中指定的filter元素驱动。FilterChain的doFilter()方法来调用下一个过滤器或servlet;

最后是destroy(),它在撤销实例之前完成所需要的清理工作。

2.声明和确定过滤器顺序

  在DD中配置过滤器时,通常会做3件事:

1)声明过滤器和过滤器参数:

在DD中声明:

使用动态注入的方式声明:

2)将过滤器映射到想要过滤的web资源;

3)组织这些映射,创建过滤器调用顺序;

当多个过滤器映射到一个给定资源时,容器会使用以下规则:

  • 先找到与URL模式匹配的所有过滤器,并按照在DD中声明的顺序组成一个链。
  • 再找到与<servlet-name>匹配的过滤器,并放在链中。

  4)过滤器可以直接应用于直接来之客户的请求,但是如果请求来自于转发、包含、错误处理,过滤器就无法起到作用。servlet 2.4提供了<dispatcher>元素解决这个问题。

3.包装器

  servlet API中的包装器功能及其强大,它们为你要包装的东西实现了所需的所有方法,并将所有调用委托给底层的请求或相应对象。你要做的只是扩展某个包装器,如果要在哪些方法中做些特殊的定制工作,只要覆盖这些方法就可以了。包装器类是使用装饰模式的一个典型例子。

  创建一个特定版本的请求或响应,这在创建过滤器时实在太常用了。所以Sun创建了4个“便利类”,一边更容易地完成这个任务:

  • ServletRequestWrapper
  • HttpServletRequestWrapper
  • ServletResponseWrapper
  • HttpServletResponseWrapper

  请求包装器是指利用HttpServletRequestWrapper类将请求中的内容进行统一修改,例如修改请求字符编码、替换字符、权限验证等。

  响应包装器是指利用HttpServletResponseWrapper类将相应中的内容进行统一修改,例如压缩输出内容、替换输出内容等。因为HttpServletResponse不能缓存输出内容,所以在doFilter()之后过滤器再想处理输出为时已晚,此时servlet已经直接将输出返回给客户。所以需要自定义一个具备缓存功能的response,这样在doFilter()之后过滤器可以进行输出的处理。

时间: 2024-10-11 11:12:29

过滤器与包装器的相关文章

【Head First Servlets and JSP】笔记 28: 过滤器与包装器

1.过滤器的执行顺序: <url-pattern> 为第一梯队, <servlet-name> 为第二梯队,梯队内的执行顺序和 DD 里的声明顺序相同. When the container recives a request, it first finds all the filter mappings with a <url-pattern> that matches the request URI. This becomes the first set of fi

javaweb 中的过滤器 包装器

过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器: 压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地方: 1.容器知道过滤器的api,过滤器api的其他成员能够訪问ServletContext 还能够与其他过滤器链接 2.容器管理过滤器的生命周期,过滤器有init和destroy方法.还有doFilter方法 3.web应用能够有非常多过滤器.须要在配置文件里配置 过滤器的生命周期 init 容器实例化一

《Head First Servlets & JSP》-13-过滤器和包装器

过滤器是什么 与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获和处理清求,另外 servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应. 容器根据DD中的声明来确定何时调用过滤器.在DD中,部署人员要建映射.明确对于哪个请求URL模式要调用哪些过滤器.所以,要由部署人员(而不是程序员)来确定哪些请求或响应应当由哪些过滤器处理. 过滤器要做的事情 只有一个过滤器接口:Filter,根据使用方式,可完成诸如以下工作: 请求过滤器可以完成

java基本类型和包装器类

java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了.这些包装类有:Boolean,Byte,Short,Character,Integer,Long,Float,Double,Void共9个(注意:Date不是,无其基本类型). 一. 包装类(Wrapp

过滤器和拦截器的区别

---------------------siwuxie095 过滤器和拦截器的区别 过滤器:过滤器理论上能过滤任何内容,如:HTML.JSP.Servlet.图片路径 拦截器:拦截器只能拦截 Action 附: Servlet 和 Action 的区别 Servlet:默认第一次访问时创建,创建一次,是单实例对象 Action:每次访问时都创建,创建多次,是多实例对象 [made by siwuxie095]

(转)过滤器和拦截器的区别

1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的

Struts2中过滤器和拦截器的区别

拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程的就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比

对象包装器与自动装箱

前言 前面提到过,除了int,float这些基本数据类型,其他所有数据类型在Java中都是类. 那么,如果我希望这些基本类型也是类类型呢? 那么就使用对象包装器吧. 包装器的作用 1. 它能够提供很多类型转型方面的方法. 2. 泛型数据的成员只能是对象. 自动装箱 就是当你使用某个基础类型,但实际类型要求是它的包装器的时候,编译器不会报错,会帮你自动完成转型. 如: ArrayList <Integer> array = new ArrayList <> (): array.add

函数包装器

在看express的源码中,经常看到函数包装的写法,有点难理解,函数包装器的作为是对一个函数进行包装,返回另外一个函数. 在包装的过程中,对旧函数和传递的参数进行改造加工.一般模式是: // oldF 旧函数, newF 新函数,callback回调函数 options 参数 newF = function(oldF,callback, options) { return function(){ // 在调用newF是,获取newF的参数 var args = Array.prototype.s