《Head First Servlets & JSP》-13-过滤器和包装器
过滤器是什么
与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获和处理清求,另外 servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应。
容器根据DD中的声明来确定何时调用过滤器。在DD中,部署人员要建映射。明确对于哪个请求URL模式要调用哪些过滤器。所以,要由部署人员(而不是程序员)来确定哪些请求或响应应当由哪些过滤器处理。
过滤器要做的事情
只有一个过滤器接口:Filter,根据使用方式,可完成诸如以下工作:
请求过滤器可以完成:
- 完成安全检查
- 重新格式化请求首部或体
- 建立请求审计或日志
响应过滤器可以完成:
- 压缩响应流
- 追加或修改响应流
- 创建一个完全不同的响应
注意,没有RequestFilter或ResponseFilter之类的接口,只有一个Filter接口。
过滤器是模块化的,可以在DD中配置
- 容器知道过滤器API
一个类实现了Filter接口,会从一个普通Java 类变为J2EE过滤器,过滤器API或其他成员允许过滤器访问ServletContext,而且可以与其他过滤器链接。 - 容器管理过滤器的生命周期
类似servlet,过滤器有init()和destroy()方法,还有doFilter()方法。 - 在DD中声明
DD可以声明请求要运行哪些过滤器,以及运行的顺序。
实例:建立请求跟踪过滤器

过滤器的生命周期
- init()
完成调用过滤器之前的所有初始化任务,如上述代码显示的保存FilterConfig对象的一个引用,以备过滤器以后使用。 - doFilter()
真正的工作在此完成,如把用户名记录到文件中、压缩响应输出。
它包含三个参数:
ServletRequest(不是HttpServletRequest)
ServletResponse(不是HttpServletResponse)
FilterChain - destroy()
撤销实例之前完成的清理工作。
注意FilterChain接口的doFilter和Filter接口的doFilter()不同。
前者负责明确接下来调用谁的doFilter()方法(若没有Filter则调用servlet的service()方法)。
后者是过滤器的真正方法。
过滤器可看成“可入栈”
这个栈是概念性的,可能并不存在。

DD中声明和确定过滤器
在DD中配置过滤器,会做3件事:
- 声明过滤器
- 将过滤器映射到想要过滤的Web资源
- 组织这些映射,创建过滤器调用序列
两个规则:
filter元素规则
必须有filter-name
必须有filter-class
init-param可选,可以多个filter-mapping元素规则
必须有filter-name
url-patter或servlet-name必须有一个
url-pattern元素定义了哪些Web应用资源使用这个过滤器
servlet-name元素定义了哪个servlet使用这个过滤器
过滤器可以应用于请求分派器
2.4版本,允许为通过分派请求的Web资源声明一个过滤器映射,如下:

- 声明规则
必须要有filter-name。
必须要有url-pattern或servlet-name元素其中之一。
可以有0~4个dispatcher元元素。
REQUEST值表示对客户请求启用过滤器。如果没有指定dispatcher元素.则默认为REQUEST 。
INCLUDE值表示对由一个include()调用分派来的请求启用过滤器。
FORWARD位表示对由一个forward()调用分派来的请求启用过滤器。
ERROR直表示对错误处理器调用的资源启用过滤器。
用一个响应端过滤器压缩输出
容器已经实现了HttpServletResponse接口;doFilter()和service()方法就是以这样一个响应作为参数。但是要让这个压缩过滤器正常工作,必须建立我们自己的HttpServletResponse接口定制实现,并把它通过chain.doFilter()调用传递到servlet。而且这个定制实现还必须包含一个定制输出流,因为这正是我们的目标,在servlet写输出之后并且在输出返回给客户之前,过滤器就能拿到这个输出。

- 缺点难点:需要实现复杂的HttpServletResponse接口,不过通常不这么做。

实现自己的HttpServletResponse太负责,怎么办?——servlet包装器
创建一个特定版本的请求或响应,这在创建过滤器里实在太常用了,所以Sun创建了4个“便利’类,以便更容易地完成这个任务,我们只需要继承某个包装器类就可以了:
- ServletRequestWrapper
- HttpServletRequestWrapper
- ServletResponseWrapper
- HttpServletResponseWrapper
伪代码
- 看看下面继承包装器类的伪代码:

- 增加第2个包装器

看看具体的实现代码
压缩过滤器代码

调用的压缩包装器代码
(这个是servlet世界中最复杂的问题之一)

压缩包装器,辅助类:

《Head First Servlets & JSP》-13-过滤器和包装器的更多相关文章
- 【Head First Servlets and JSP】笔记 28: 过滤器与包装器
1.过滤器的执行顺序: <url-pattern> 为第一梯队, <servlet-name> 为第二梯队,梯队内的执行顺序和 DD 里的声明顺序相同. When the co ...
- Head First Servlets & JSP 学习笔记 第十三章 —— 过滤器的威力
过滤器可能是最强大的Web应用开发工具了! 与Servlet非常类似,过滤器就是Java组件,请求发送到Servlet之前,可以用过滤器截获和处理请求:另外Servlet结束工作之后,但在响应发回给客 ...
- 《Head First Servlets & JSP》-1-前言
<Head First Servlets & JSP>(中文版) BB,KS & BB著, 苏钰函,林剑译,中国电力出版社 数据交互 Web浏览器和Web服务器:通过Htt ...
- javaweb 中的过滤器 包装器
过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器: 压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地 ...
- JSP中过滤器的设置
JSP中过滤器的设置 package com.filter; import java.io.IOException; import java.net.URLDecoder; import java.u ...
- Head First Servlets & JSP 学习笔记 第三章 —— MVC迷你教程
临渊羡鱼,不如退而结网!是时候动手搞事情了! 我们的四大步骤: ①分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构: (这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体 ...
- Struts2中过滤器和拦截器的区别
拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...
- Servlet 过滤器、拦截器、监听器以及文件上传下载
在学习之初,总是对过滤器.拦截器.监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户 ...
- Flask 页面缓存逻辑,jinja2 过滤器,测试器
回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...
随机推荐
- centos安装yum源
网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错,将yum源设置为163yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到.具体设置方法如下 ...
- 异常:java.lang.IllegalStateException: No instances found of configserver(里面是一个微服务名)
今天本地测试代码时出现了个异常,该异常出现的原因是:微服务启动的顺序出现了问题: 应该先启动本地eureka,然后在启动本地配置中心,然后在启动具体的微服务.
- java中List、Map、Set、Collection、Stack、Queue等的使用
java中这几个东西是比较常用的,虽然我用的不多,也正是因为用的不多,所以我一直搞不清楚他们之间的具体用法以及相互之间的关系,现在特单独作为一个东西来总结一下. 本文参考一下资料: 1.<jav ...
- es5中foreach的用法
HTML代码: <p id="result"></p> JS代码: var eleResult = document.getElementById(&quo ...
- ORA-12514: TNS: no listener 解决方案
服务端:oracle 11g 客户端: pl/sql 问题描述: 用客户端 pl/sql 连接登录的时候,提示 "ORA-12514: TNS: no listener". 在服务 ...
- Python:列表中,增加元素、删除元素、切片、其它
一.向列表中增加元素 list.append(单个元素):在list列表末端增加一个元素: list.extend([元素1,元素2]):在list列表末端增加多个元素: list.insert(元素 ...
- 腾讯Web前端开发框架JX(Javascript eXtension tools)
转自:Web前端开发-Web前端工程师 » 腾讯Web前端开发框架JX(Javascript eXtension tools) JX – Javascript eXtension tools 一个类似 ...
- PHP类(一)-类的实例化
类的实例化就是对象.一个类可以分成两个部分,一个是静态描述,就是类里的成员属性.第二个是动态描述,就是类里的成员方法,也就是对象的功能. 声明一个类,可以在class前加一些关键字,如abstract ...
- windows服务编写和“以管理员运行”程序的方法
本文将首先解释如何 创建 一个定期查询可用物理内存并将结果写入某个文本文件的服务.然后指导你完成生成,安装和实现服务的整个过程. 第一步:主函数和全局定义 首先,包含所需的头文件.例子要调用 Win3 ...
- Windows下自由创建.htaccess文件的N种方法
.htaccess是apache的访问控制文件,apache中httpd.conf的选项配合此文件,完美实现了目录.站点的访问控 制,当然最多的还是rewrite功能,即URL重写,PHP中实现伪静态 ...