过滤器是什么

与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-过滤器和包装器的更多相关文章

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

    1.过滤器的执行顺序: <url-pattern> 为第一梯队, <servlet-name> 为第二梯队,梯队内的执行顺序和 DD 里的声明顺序相同. When the co ...

  2. Head First Servlets & JSP 学习笔记 第十三章 —— 过滤器的威力

    过滤器可能是最强大的Web应用开发工具了! 与Servlet非常类似,过滤器就是Java组件,请求发送到Servlet之前,可以用过滤器截获和处理请求:另外Servlet结束工作之后,但在响应发回给客 ...

  3. 《Head First Servlets & JSP》-1-前言

    <Head First Servlets & JSP>(中文版) BB,KS & BB著, 苏钰函,林剑译,中国电力出版社 数据交互 Web浏览器和Web服务器:通过Htt ...

  4. javaweb 中的过滤器 包装器

    过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器:     压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地 ...

  5. JSP中过滤器的设置

    JSP中过滤器的设置 package com.filter; import java.io.IOException; import java.net.URLDecoder; import java.u ...

  6. Head First Servlets & JSP 学习笔记 第三章 —— MVC迷你教程

    临渊羡鱼,不如退而结网!是时候动手搞事情了! 我们的四大步骤: ①分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构: (这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体 ...

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

    拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...

  8. Servlet 过滤器、拦截器、监听器以及文件上传下载

    在学习之初,总是对过滤器.拦截器.监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户 ...

  9. Flask 页面缓存逻辑,jinja2 过滤器,测试器

    回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...

随机推荐

  1. poj1778

    在一个 8*8 的棋盘里有一个国王和一些骑士,我们要把他们送到同一顶点上去. 国王能够选择一名骑士作为坐骑,而与骑士一起行动(相当于一个骑士),同一位置, 同一时刻可以有多个骑士.问最少走的步数. 骑 ...

  2. ecshop彻底去版权把信息修改成自己的全教程

    前台部分: 一.去掉头部title部分的ECSHOP演示站-Powered by ecshop 1.问题:“ECSHOP演示站”方法:在后台商店设置 – 商店标题修改2.问题:“ Powered by ...

  3. Vue forms

    Vue forms Vue 的表单. 表单中的数据和是双向绑定的. 你可以使用 v-model 对控件元素进行数据双向绑定. 比较有用的修饰符 .lazy .number .trim

  4. 编码不规范之将request传参到sevice中

    最近审核团队成员代码,发现确实有很多不规范的地方,其中问题之一就是将request.response.session等参数到传入到sevice层处理,在sevice中通过request对象获取到参数后 ...

  5. HDU1387:Team Queue

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1 ...

  6. 聊聊“现在学习MFC有用吗?”

    我用MFC做了4年多,后来转到WPF也做了快5年.对于二者,不敢说精通,但应该算入门.结合自己经历,如果不考虑项目需求,我认为新手学习WPF或许更好点.有3点: 1)大家都知道最近几年Motorola ...

  7. IHE 官方网址有用资源介绍

    实现标准: http://www.ihe.net/Technical_Frameworks/ 各个实现框架文档, 比如XDS,XCA,PIX,PDQ等 测试工具:http://www.ihe.net/ ...

  8. flask之Jinja2

    Jinja2 is a library found at http://jinja.pocoo.org/; you can use it to produce formatted text with ...

  9. ORA-28547:connection to server failed, probable Oracle Net admin error错误,解决方法

    当用navicat连接oralce数据库时报ORA-28547错误时,直接懵逼了,上网查了资料说是navicat自带的oci.dll文件的版本和服务器端的oralce数据库的版本不一致造成的. 修改O ...

  10. 分布式锁之一:zookeeper分布式锁1

    zookeeper集群的每个节点的数据都是一致的, 那么我们可以通过这些节点来作为锁的标志. 首先给锁设置一下API, 至少要包含, lock(锁住), unlock(解锁), isLocked(是否 ...