Servlet过滤器.docx
- 文档编号:2843667
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:15
- 大小:22.37KB
Servlet过滤器.docx
《Servlet过滤器.docx》由会员分享,可在线阅读,更多相关《Servlet过滤器.docx(15页珍藏版)》请在冰豆网上搜索。
Servlet过滤器
Servlet过滤器
一、什么是Servlet过滤器
过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或者Servlet容器。
Servlet过滤器可以应用在客户机和servlet之间、servlet和servlet或JSP页面之间,以及所包括的每个JSP页面之间。
二、实现一个Servlet过滤器
Servlet过滤器API包含javax.servlet包中的3个接口,分别是Filter、FilterChain和FilterConfig。
实现一个Servlet过滤器的确要经历三个步骤。
1、编写Servlet过滤器实现类。
2、配置Servlet过滤器。
把该过滤器添加到Web应用程序中(通过在Web部署描述符/web.xml中声明它);
3、部署Servlet过滤器。
把过滤器与应用程序一起打包并部署它;
Servlet容器对部署描述符中声明的每一个过滤器,只创建一个实例(或实例池)。
与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此,开发过滤器时,也要注意线程安全的问题。
三、编写过滤器实现类
1、Filter接口:
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口
a、init(FilterConfig):
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。
在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。
b、doFilter(ServletRequest,ServletResponse,FilterChain):
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。
FilterChain参数用于访问后续过滤器。
c、destroy():
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。
2、过滤器实现类创建步骤(过滤器实现类生命周期):
a.实现javax.servlet.Filter接口。
b.初始化:
实现init方法,读取过滤器的初始化参数。
c.过滤:
实现doFilter方法,完成对请求或响应的过滤。
d.转发或阻塞:
调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应。
e.析构:
destroy方法销毁过滤器,释放过滤器占用的资源。
四、配置Servlet过滤器(在web.xml中配置)
过滤器通过web.xml文件中的两个XML标签来声明:
1、<filter>:
定义过滤器的名称,并且声明过滤器实现类和init()参数。
<filter-name>:
指定过滤器的名字;
<filter-class>:
指定过滤器类的类名,包括类的路径;
<init-param>:
为过滤器实例提供初始化参数,可以有多个;
2、<filter-mapping>:
将过滤器与servlet或URL模式相关联。
<filter-name>:
指定过滤器的名字,与<filter>中的子元素<filter-name>相对应;
<url-pattern>:
指定和过滤器关联的URL,为”/*”表示所有URL;
3、<filter-mapping>元素还可以包含0到4个<dispatcher>,指定过滤器对应的请求方式,
可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST.
REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。
如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。
除此之外,该过滤器不会被调用。
FORWARD
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR
如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。
除此之外,过滤器不会被调用。
在web.xml中配置Servlet和Servlet过滤器,应该先声明过滤器元素,再声明Servlet元素。
两个或更多个过滤器应用到同一个资源,按照它们在配置文件中显示的先后次序调用它们。
例子1:
单个过滤器配置:
容器将其应用于所有接收的请求
<filter>
<filter-name>FilterName</filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例子2:
过滤器应用到特定目录或资源(文件)的配置:
此容器只有在接收到对/mydocs目录中的资源的请求时才会应用该过滤器。
<filter>
<filter-name>FilterName</filter-name>
<filter-class>packageName.FilterName</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterName</filter-name>
<url-pattern>/mydocs/*</url-pattern>
</filter-mapping>
例子3:
定义一个过滤器链:
两个或更多个过滤器应用到同一个资源,按照它们在配置文件中显示的先后次序调用它们。
<filter>
<filter-name>FilterOne</filter-name>
<filter-class>packageName.FilterOne</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterOne</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterTwo</filter-name>
<filter-class>packageName.FilterTwo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTwo</filter-name>
<url-pattern>/mydocs/*</url-pattern>
</filter-mapping>
五、部署Servlet过滤器
只需把过滤器类和其他Web组件类包括在一起,把web.xml文件(连同过滤器定义和过滤器映射声明)放进Web应用程序结构中,servlet容器将处理之后的其他所有事情。
六、Servlet过滤器实现注意事项
1.由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,
所以ServletRequest、ServletResponse在使用前都必须先转换成HttpServletRequest、HttpServletResponse再进行下一步操作。
2.在web.xml中配置Servlet和Servlet过滤器,应该先声明过滤器元素,再声明Servlet元素。
3.如果要在Servlet中观察过滤器生成的日志,应该确保在server.xml的localhost对应的<host>元素中配置如下<logger>元素:
<LoggerclassName=“org.apache.catalina.logger.FileLogger”
directory=“logs”prefix=“localhost_log.”suffix=”.txt”
timestamp=“true”/>
七、过滤器的实现方式
过滤器实现方式在不保证功能前提下,从性能角度考虑有如下先后顺序:
Decorator或Proxy模式;AOP拦截器。
1,标准Servlet控制器
包装了请求和响应对象。
web容器来充当过滤管理器(FilterManager)和过滤链(FilterChain)来管理和协调过滤器。
问题:
功能覆盖范围上,也是一个scope,如果功能需求要为某个类的方法实现实现过滤,使用一个ServletFilter这样过滤器实现。
但是它对所有的Servlet请求都进行过滤,这无疑范了杀鸡取卵的错误,会造成系统性能上的损失。
2,使用Decorator模式来定制过滤器
如果过滤器是业务逻辑的一部分,而且在设计时,我们可以确定这些过滤器,进行特定指定的拦截。
Decorator模式在点上针对性相当强,特别在这个点上有一系列过滤器需要实现时。
如果某个过滤功能是很多类都需要的,会形成很多Decorator附加类,造成点形成面的情况,则升级使用AOP拦截器。
优点:
能够动态地为过滤器扩展功能。
也可以使用FilterManager和FilterChain过滤器链负责协调和管理过滤处理,这样单独的过滤器就不用和其他过滤器直接通信了。
问题:
不能以一种标准的可移植的方式支持对请求和响应对象的包装,而且不能够修改请求对象。
缺乏完善的缓存机制。
当过滤器要控制输出流的时候,还必须引入某种形式的缓存机制。
3,使用模板方法模式来定制过滤器。
可以和其他方法混用。
优点:
这种方式是基于标准的过滤器的,基本过滤器作为一个基类,封装了过滤器API的所有细节。
专注于预处理和后处理的所有逻辑。
基本过滤器声明了每个过滤器要完成的方法,每个过滤器子类来定义这些定义方法。
由超类来控制子类的控制流程。
4,使用AOP框架拦截器。
当功能不是针对某个具体类或方法(方法权限除外),而是一系列类,使用动态AOP拦截器,性能损耗也是值得的,而且是必要的。
八、过滤器的应用场合
简洁的说法:
1.认证过滤:
对用户请求进行统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Servlet 过滤器