JavaWeb总结(九)
过滤器
- 一个中间组件,用于拦截源数据和目的数据之间的消息
- 过滤二者之间传递的数据
Web应用上的过滤器
-驻留在Web服务器上的Web组件
-过滤从客户端传递到服务器端的请求和响应
单个过滤器
当Web容器接收到一个对资源的请求时,它将判断是否有过滤器器与这个资源相关联,如果有那么容器就把请求交给过滤器进行处理。在过滤器中,我们可以更改请求的内容,或者重新设置请求头,然后再将请求传递给目标资源。当目标资源对请求做出响应时,容器同样会将响应转发给过滤器,在过滤器中,我们可以对响应的内容进行更改,然后将响应发送回客户端。在Web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,他们并不需要知道过滤器的存在。
Web应用上部署多个过滤器
过滤器链
过滤器可以组成一个过滤器链。链中的每个过滤器负责特定的操作和任务,客户端的请求和响应在这些过滤器之间传递
过滤器的一些常见应用:
- 认证过滤:对用户请求进行统一的认证。
- 登录和审核过滤:对用户的访问请求进行记录和审核。
- 图像转换过滤:转换图像格式。
- 数据压缩过滤 :对用户发生的数据进行压缩,从而减少传输量。
- 加密过滤:对请求和响应进行加密解密处理。
- 令牌过滤
- 资源访问触发事件过滤
- XSLT过滤
- MIME-type过滤
Servlet的编码、编译、部署
- 编码
所有的过滤器必须实现javax.serlvet.Filter接口。实现Filter接口中定义的三个方法init()、doFilter()、destroy()。
- 编译
添加Servlet.jar包到工程jar包目录下。
- 部署
将编译好的class文件放置在Web应用程序的classes目录下
在部署文件web.xml中添加过滤器的注册与映射
<!--指定过滤器名和过滤器类-->
<filter>
<filter-name>HelloWorldFilter</filter-name>
<filter-class>com.lovobook.HelloWorldFilter</filter-class>
</filter>
<!-- 将过滤器与URL模式关联-->
<filter-mapping>
<filter-name>HelloWorldFilter</filter-name>
<url-pattern>/filter/*</url-pattern>
</filter-mapping>
过滤器API
由容器实现的接口
- javax.servlet.Filter
- javax.servlet.FilterChain
- javax.servlet.FilterConfig
四个包装器类
- javax.servlet.ServletRequestWrapper
- javax.servlet.ServletResponseWrapper
- javax.servlet.http.HttpServletRequestWrapper
- javax.servlet.http.HttpServletResponseWrapper
Filter接口
方法 |
描述 |
void init(FilterConfig) |
在应用程序启动时,由容器调用 |
Void doFilter(ServletRequest, ServletResponse, FilterChain) |
对于每个URL映射到该过滤器的请求,由容器调用该方法。 |
void destroy() |
在应用程序关闭时,由容器调用。 |
- 过滤器的生命周期方法 ,过滤器API不提供Filter接口的任何实现 。自定义的过滤器必须明确地实现所有三个方法
- 容器仅调用过滤器实例的init()方法一次。在init()方法没有执行完前,容器不会转发任何请求到过滤器
- doFilter()方法给过滤器对象一个机会来处理请求,转发请求到过滤器链中的下一个组件,或者自己回复客户端
- destroy()是过滤器最后一个方法来调用,以指示过滤器生命周期的结束
FilterConfig接口
- 为过滤器提供初始化参数,并将对象作为参数传递给过滤器的init()方法
- 提供了一个过滤器所在的应用程序ServletContext的应用
- 由Servlet容器实现
方法 |
描述 |
String getFilterName() |
返回在部署描述文件中指定的过滤器的名称 |
String getInitParameter(String) |
返回在部署描述文件中指定的参数的值 |
Enumeration getInitParameterNames() |
返回在部署描述文件中指定的所有参数的名称。 |
ServletContext getServletContext() |
返回Web应用程序的ServletContext。过滤器可以使用ServletContext设置、获取application范围内的属性。 |
FilterChain接口
- 由容器实现,由容器将其实例作为参数传到Filter接口的doFilter()方法
- 将请求传递到过滤器链的下一个组件
方法 |
描述 |
Void doFilter(ServletRequest, ServletResponse) |
我们从一个过滤器对象的doFilter()方法中调用此方法,以继续过滤器链的传递过程。它会将控制转到链中的下一个组件。 |
配置Filter
<filter>元素
元素层次图
<filter>
<filter-name>ValidatorFilter</filter-name>
<description>Validates the requests</description>
<!--文件路径-->
<filter-class>com.lovobook.filters.ValidatorFilter</filter-class>
<!--初始参数-->
<init-param>
<param-name>locale</param-name>
<param-value>USA</param-value>
</init-param>
</filter>
<filter-mapping>元素
Filter-mapping结构图
<!--所有匹配到该URL定义的请求,都要被filter-name中定义的过滤器过滤。-->
<filter-mapping>
<filter-name>ValidatorFilter</filter-name>
<url-pattern>*.doc</url-pattern>
</filter-mapping>
<!--servlet-name用于定义一个servlet名,所有对该servlet的访问都要被filter-name中定义的过滤器过滤 -->
<filter-mapping>
<filter-name>ValidatorFilter</filter-name>
<servlet-name>reportServlet</servlet-name>
</filter-mapping>
配置过滤器链
- 用多个过滤器处理在同一个请求
- 使用多个<filter-mapping>元素配置过滤器链
- 首先调用匹配请求URI的过滤器<url-pattern>
- 再查找用Servlet名匹配请求URI的所有过滤器<servlet-name>
- 过滤器的顺序按照它们在部署描述文件中出现的顺序排序
<filter-mapping>
<filter-name>FilterA</filter-name>
<servlet-name>RedServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>FilterB</filter-name>
<url-pattern>*.red</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>RedServlet</servlet-name>
<url-pattern>*.red</url-pattern>
</servlet-mapping>
<!--FilterA先执行?还是FilterB先执行?
容器会先调用匹配请求URI的过滤器,然后才是匹配servlet名的过滤器。因此,FilterB始终在FilterA之前调用-->
使用请求和响应包装器
- 所有的四个包装器类(包括ServletRequestWrapper、ServletResponseWrapper 、HttpServletRequestWrapper、HttpServletResponseWrapper的工作方式基本相同)。这四个类在其构造器中用request或response对象作为参数,并代理对两个对象的所有方法的调用。这样就运行我们扩充这些类,并使用自定义的行为覆盖类的方法
- 在请求送到过滤器链的下一个组件之前更改请求的内容
- 改变从前一个组件接收的响应
public class MyRequestWrapper extends HttpServletRequestWrapper {
public MyRequestWrapper(HttpServletRequest req) {
super(req);
}
//重写接口方法
……
} public class MyResponseWrapper extends HttpServletResponseWrapper {
public MyResponseWrapper(HttpServletResponse response) {
super(response);
}
……
} public class TextToHTMLFilter implements Filter {
……
public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) …{
MyRequestWrapper mrw = new MyRequestWrapper (req);
MyResponseWrapper mrsw = new MyResponseWrapper(res);
filterChain.doFilter(mrw , mrsw );
}
}
JavaWeb总结(九)的更多相关文章
- JavaWeb总结(九)—过滤器
一.Filter简介 Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:JSP.Servlet.静态文件.静态HTML等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限 ...
- JavaWeb 后端 <九> 之 JDBC加强
一.大结果集的分页(重点,难点) 1.分批次查询:分页 2.基于数据库的分页:依赖的是数据库的分页语句(不同数据库是不同的) MySQL:每页显示10条. select * from XXX limi ...
- JavaWeb(九)AJAX
Ajax ajax:AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新 AJAX:Asynchronous JavaScript and XML,异步 javasc ...
- JavaWeb学习 (九)————HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- javaweb(十九)——JSP标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- JavaWeb 11_jsp九大内置对象
1. out: 输出对象,向客户端输出内容2. request: 请求对象;存储"客户端向服务端发送的请求信息" request对象的常见方法: String getParamet ...
- javaWEB总结(12):JSP页面的九个隐含对象
前言 jsp本质上是一个servlet,而在jsp中有九个不用声明就可以使用的对象,我们叫他隐含对象.本文基于上文所写,如有需要可查看上一篇文章javaWEB总结(11):JSP简介及原理. 打开上次 ...
- Javaweb学习随笔_JSP的九大内置对象
JSP内置对象整理 1. 九大内置对象: out,request,response,session,application,page,pageContext,config,Exception. 1.1 ...
- JavaWeb学习总结(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- javaWeb学习总结(8)- JSP中的九个内置对象(4)
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
随机推荐
- Java设计模式----初识适配器模式
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- leveldb源码分析--Key结构
[注]本文参考了sparkliang的专栏的Leveldb源码分析--3并进行了一定的重组和排版 经过上一篇文章的分析我们队leveldb的插入流程有了一定的认识,而该文设计最多的又是Batch的概念 ...
- ExpressRoute 先决条件和清单
若要使用 ExpressRoute 连接到 Azure 服务,需确认是否符合以下部分中所列的要求. 帐户要求 使用中的有效 Azure 帐户.需有此帐户才能设置 ExpressRoute 线路. 连接 ...
- 从Azure上构建Linux应用程序映像
下图描述了总体的虚拟机的VHD映像生成以及发布到 Azure Azure 镜像市场的全过程: 具体步骤如下: 从Azure管理平台上Linux申请虚拟机, 安装和配置您要发布的应用软件产品,制作成映像 ...
- [WinCE] Can't find P/Invoke DLL sqlceme35.dll
找到目录: C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i 将 sqlce ...
- 从MySQL向Greenplum集群中导入数据
我们要从MySQL当中导出数据到Greenplum当中,按照以下步骤就可以 1:将MySQL当中的表导出外部文件 以schema_name.table_name为例 select product_id ...
- 如何让chrome浏览器自动翻译
我用的chrome浏览器,最初用的时候浏览器默认自动翻译英文,我感觉很麻烦.所以我选择了一律不翻译.但是我当我想翻译的的时候又不知道怎么操作.一直郁闷到现在.今天我突然发现了一个方法可以让你的浏览器自 ...
- 铁乐学python_Day44_IO多路复用
目录 IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO ...
- Visual Studio 2013 Web开发新特性
微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Server 2013. ...
- python第十四课--排序及自定义函数之自定义函数(案例二)
案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...