Java Servlet (1) —— Filter过滤请求与响应
Java Servlet (1) —— Filter过滤请求与响应
版本: Java EE 6
参考来源:
Oracle:The Java EE 6 Tutorial: Filtering Requests and Responses
CSDN:Java中Filter、Servlet、Listener的学习
正文
在oracle javaee 6的官方文档中短短的一段话,分别从定义、内容、应用、实现这四个方面对Filter这个东西做了详细的说明

定义
A filter is an object that can transform the header and content (or both) of a request or response. Filters differ from web components in that filters usually do not themselves create a response. Instead, a filter provides functionality that can be “attached” to any kind of web resource. Consequently, a filter should not have any dependencies on a web resource for which it is acting as a filter; this way, it can be composed with more than one type of web resource.
以上定义有几层意思:
Filter是一个对象
(A filter is an object)
Filter对象的功能是可以变换请求或相应的头和内容
(can transform the header and content (or both) of a request or response)
Filter与web components不同,不自己创建相应
(Filters differ from web components in that filters usually do not themselves create a response)
Web Components是什么?(Wiki:Web Components)
Wiki上的定义比较抽象,但是它也给出了Web Components所表现的几个具象形式:
自定义元素(Custom Elements)
隐藏DOM(Shadow DOM)
HTML引入(HTML Imports)
HTML模板(HTML Templates)
总而言之,Web Components可以认为是一些资源(resource)的组件。
为什么我将它看成资源的组件?下面这点可以看出(Instead...web resource)
Filter可以“附在”(attached)任何web资源上
(Instead, a filter provides functionality that can be “attached” to any kind of web resource)
Filter不应依赖与它“依附”的web资源
(Consequently, a filter should not have any dependencies on a web resource for which it is acting as a filter)
这点是与上第4点对应。第4点为正说:应该怎样;这里为反说:不应怎样。
Filter可以与多个web资源组合在一起使用
(this way, it can be composed with more than one type of web resource)
正因为有4、5两特点,所以Filter具有这种能力。
何种能力呢?
功能
The main tasks that a filter can perform are as follows:
- Query the request and act accordingly.
- Block the request-and-response pair from passing any further.
- Modify the request headers and data. You do this by providing a customized version of the request.
- Modify the response headers and data. You do this by providing a customized version of the response.
- Interact with external resources.
Filter的主要功能包括:
查询请求然后做相应动作
(Query the request and act accordingly)
这里“查询”(Query)主要体现在filter-mapping中的url-pattern。
拦截请求与响应对(在向下传递时)
(Block the request-and-response pair from passing any further)
注意这里是请求与响应对,这个“对”(pair)十分重要。
修改请求的头与数据
(Modify the request headers and data. You do this by providing a customized version of the request)
修改响应的头与数据
(Modify the response headers and data. You do this by providing a customized version of the response)
与外部资源交互
(Interact with external resources)
以上这点比较抽象。与什么样的外部资源?如何交互?
暂且不回答这个问题,看Filter的应用场景。
应用
验证(Authentication)
例如SSO等验证实现都有AuthenticationFilter。
日志(Logging)
为了实现任何Filter的应用,都可以加入日志之类的功能。
图像转换(Image Conversion)
主要常见于图像格式的转换,根据不同客户端可能支持显示的格式不同,处理图片响应。
数据压缩(Data Compression)
对于较大的请求与响应体,可以设置数据压缩GZipFilter。
加密(Encryption)
对于SSL或者自行实现的安全措施,会对请求与响应进行加密。
标记流(Tokenizing Streams)
这个主要见于搜索应用中,比如Elastic会有TokenFilter。
XML变换(XML transformations)
一个典型应用可能是使用xslt转换xml的内容。
等
如此看来,功能中的最后一点中提到的“与外部资源的交互”就很好理解了,以上的这些验证、加密、压缩、变换等功能都需要外部资源的支持。
实现
最后实现也只是两句话,但是足以将Filter的内涵说清楚。
You can configure a web resource to be filtered by a chain of zero, one, or more filters in a specific order.
这里提到了几个关键点:
- 目标——配置web资源(web resource)
- 方式——链式(chain)
- 数量——0、1或多(zero, one, or more filters)
- 顺序——特定的顺序(in a specific order)
This chain is specified when the web application containing the component is deployed and is instantiated when a web container loads the component.
补充说明链式是如何工作的:
- 编译时(静态)——在编译部署的时候,这个链就已经定义好了。
- 运行时(动态)——在加载组件的时候,这个链被实例化。
至于详细实现方式,另开文章做具体说明。

原文
Filtering Requests and Responses
A filter is an object that can transform the header and content (or both) of a request or response. Filters differ from web components in that filters usually do not themselves create a response. Instead, a filter provides functionality that can be “attached” to any kind of web resource. Consequently, a filter should not have any dependencies on a web resource for which it is acting as a filter; this way, it can be composed with more than one type of web resource.
The main tasks that a filter can perform are as follows:
- Query the request and act accordingly.
- Block the request-and-response pair from passing any further.
- Modify the request headers and data. You do this by providing a customized version of the request.
- Modify the response headers and data. You do this by providing a customized version of the response.
- Interact with external resources.
Applications of filters include authentication, logging, image conversion, data compression, encryption, tokenizing streams, XML transformations, and so on.
You can configure a web resource to be filtered by a chain of zero, one, or more filters in a specific order. This chain is specified when the web application containing the component is deployed and is instantiated when a web container loads the component.
*扩展
问题
Filter有以上的职责,那么Interceptor的主要作用是什么呢?
结束
Java Servlet (1) —— Filter过滤请求与响应的更多相关文章
- Java web入门之Http请求和响应
三层架构 web层:JSP + Servlet.Struts 2.SpringMVC service层:Spring dao层:JDBC.DBUtils.Hibernate.MyBatis form表 ...
- Java Servlet(九):转发请求与重定向请求区别
转发: <% pageContext.setAttribute("pageContextAttr", "pageContextAttribute"); r ...
- 【Spring】使用Filter过滤请求
原文:http://liujiajia.me/#/blog/details/spring-filter-request-with-filter public class CustomizedFilte ...
- 简单的Servlet结合Jsp实现请求和响应以及对doGet和doPost的浅析
1.新建jsp,创建表单 <body> <form action="/MyfirstWeb/login"> username:<input type= ...
- 关于servlet的filter
Servlet过滤器 2009-12-08 23:12:44| 分类: Java|举报|字号 订阅 一.什么是Servlet过滤器 过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或 ...
- Servlet、Filter、Listener、Interceptor基础
第一:Servlet Servlet是个接口,全限定名是javax.servlet.Servlet,在javax.servlet包中,在servlet-api.jar(在tomcat自带的lib文件夹 ...
- Java Servlet API中文说明文档
Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1 绪言 1.2 谁需要读这份文档 1.3 Java Servlet API的组成 ...
- java Servlet中的过滤器Filter
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- Java基础ArrayList、Servlet与Filter
一.技术分享 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因 ...
随机推荐
- 【转载并记录】SpringBoot 入门(一)
https://blog.csdn.net/dhklsl/article/details/80309999 https://www.cnblogs.com/zheting/p/6707035.html ...
- java方法的继承,覆盖与重载
java中的继承使用extends关键字,在子类继承了父类之后将会获得父类的全部属性与方法(父类的构造器除外).如果在定义java类时没有显示定义她的父类,那么这个类默认将扩展java.lang.Ob ...
- IOS 集成支付宝和邮件发送
列表中自找 :http://blog.csdn.net/sing_sing?viewmode=contents
- [LeetCode] Shortest Word Distance I & II & III
Shortest Word Distance Given a list of words and two words word1 and word2, return the shortest dist ...
- lua 工具类(二)
local tonumber_ = tonumber function tonumber(v, base) end function toint(v) return math.round(tonumb ...
- 《java虚拟机》汇总所有关键要点
一 .java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统.存储区域.数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现J ...
- C++11 explicit的使用
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数 , 它的作用是表明该构造函数是显示的, 而非隐式的,跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...
- javascript基础拾遗(十三)
1.jQuery的特点 jQuery是目前非常流行的javascript库,理念是"Write Less,Do More" 1)消除浏览器差异 2)简洁的操作DOM方法 3)轻松实 ...
- 【转帖】(一)unity4.6Ugui中文教程文档-------概要
原帖至上,移步请戳:(一)unity4.6Ugui中文教程文档-------概要 unity4.6中的一个重要的升级就是GUI ,也把它称为UGUI ,废话我不多说,大家可以百度了解一下. 虽然现在处 ...
- 使用HttpClient配置代理服务器模拟浏览器发送请求调用接口测试
在调用公司的某个接口时,直接通过浏览器配置代理服务器可以请求到如下数据: 请求url地址:http://wwwnei.xuebusi.com/rd-interface/getsales.jsp?cid ...