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) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因 ...
随机推荐
- eclipse 反编译插件 jadclipse
1. 下载 JadClipse 下载JadClipse:http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download 注意选择与 ...
- 【转载并整理】mysql 1293错误 建表两个timestamp
http://www.jb51.net/article/50878.htm 这里要使用到mysql的触发器
- Android调用系统软键盘
/** * * @MethodName:closeInputMethod * @Description:关闭系统软键盘 * @throws */ public void closeInputMetho ...
- 转:纯CSS实现“鼠标移过显示层”效果
利用<a>标签的a:hover状态触发鼠标移过的动作,其中未触发状态显示为单个图片.兼容IE6/7/8以及FF/Chrome等主流浏览器.以下是图示及完整代码. 原文:http://www ...
- 基础003_V7-Memory Resources
一.综述 参考ug473.pdf. 常用Memory 资源: 在IP核中,Block memory(distributed memory为CLB中的资源): 通常选用Native,而不用AXI接口: ...
- Ingress 原理及实例
什么是Ingress 在Kubernetes中,Service和Pod的IP地址只能在集群内部网络中路由,所有到达“边界路由器”(Edge Router)的网络流量要么被丢弃,要么被转发到别处,从概念 ...
- 【SSH】Hibernate关联映射
一对一关联映射 一对一主键关联映射 一句话:不加字段.主键既是主键又是外键. 一对一单向主键关联映射 配置: <span style="font-family:KaiTi_GB2 ...
- 微信小程序-wx:for 循环列表
获取了 N 条信息(具体有多少条不确定),如何在界面中动态呈现出来呢? .wxml 代码 <view wx:for="{{items}}" wx:for-index=&q ...
- macbook安装homebrew并更换清华源
1.官网brew.sh复制安装脚本. 2.自动安装完成后,更换为清华源来加快速度.网址为:https://mirrors.tuna.tsinghua.edu.cn/help/homebrew 3.更换 ...
- Atitit 项目源码的架构,框架,配置与环境说明模板 规范 标准化
Atitit 项目源码的架构,框架,配置与环境说明模板 规范 标准化 版本1.0 作者 艾龙 attilax 1. 概述:核心业务: 1 1.1. 功能文档路径 /palmWin/src/docum ...