Filter
Filter是可以重复使用的,用于变换HTTP请求和响应以及头信息中的内容。
Filter应用举例
授权Filter
登陆,审核Filter
图像处理Filter
数据压缩Filter
加密Filter
XSL/T Filter
缓存filter
......
Filter的创建
实现接口javax.servlet.Filter,并提供一个无参的构造函数即可创建一个filter。
Filter的生命周期
在web工程发布后,在请求使引擎访问一个web资源之前,引擎必须定位Filter列表;引擎必须确保为列表中的每一个Filter建立了一个实例,并调用了他们的init(FilterConfig config)方法。
部署描述文件中定义的所有filter,仅会在每个JVM容器中产生一个实例。
引擎为filter提供了一个FilterConfig类,该类中有ServletContext和一个带有初始化参数的set。
当引擎接受一个请求时,引擎就会调用filter列表中第一个filter的doFilter方法,把ServletRequest,ServletResponse和FilterChain作为参数传给它。
filter中doFilter方法典型的处理步骤是:
1)检查请求头信息
2)创建一个实现了ServletRequest或HttpServletRequest的类,去包装request对象,以
便修改请求的头信息或体数据。
3)创建一个实现了ServletResponse或HttpServletResponse的类,去包装response对
象,以便修改响应的头信息或体数据。
4)filter可以调用链中的下一个实体,下一个实体是另一个filter,如果该filter是列表中最后的一个,则它的下一个实体就是一个目标web资源。如果要调用下一个filter的doFilter方法,把request,和response对象传给FilterChain对象的doFilter方法中就可以了。Filterchain 的doFilter方法是由引擎提供的,引擎在该方法中会定位filter列表中的下一个filter。
filter也可以阻止request继续传递并由自己来完成response。
5)在调用chain.doFilter之后,filter可以检测响应的头信息。
6)在这些过程中,filter可以抛出异常。当在调用doFilter过程中抛出UnavailableException异常时,引擎重复尝试处理下面的filter chain的方法,如过时后还没请求到filter chain 就会关闭对filter chain的请求。
7)当filter是列表中最后一个filter时,它的下一个实体是描述配置文件中filter后面的servlet或其它资源。
8)在引擎删除一个Filter之前,引擎必须调用Filter的destroy方法,来释放资源。
包装Requests 和Responses
过滤的中心观念是对request或response的包装,在这种模式下,开发者不仅可以改写存在的方法,还可以创建自己的新方法,用于特殊的过滤任务,例如:开发者希望扩展response对象,希望有个更高层次的输出流对象(writer)。
为了支持包装模式,引擎不需要保证在整个过滤链中,传递的request和response对象都是同一个对象。
Filter的环境
Filter的初始参数可以在描述配置文件中用init-params元素来配置,在运行时中,用FilterConfig的getInitParameter和getInitParamesterNames方法得到配置参数。
在web应用中配置filters
在部署描述文件中,可以使用<filter>元素来定义一个filter。
- filter-name:filter名称
- filter-class:filter类路径
- init-params:用于初始化参数
如果开发者在部署描述中为一个filter类描述了两个定义,则引擎会创建这个filter类的两个实例。
使用<filter-mapping>来定义filter关联的servlet或静态资源,可以使用<servlet-name>来关联一个servlet。
例如:
<filter-mapping>
<filter-name>Image Filter</filter-name>
<servlet-name>ImageServlet</servlet-name>
</filter-mapping>
还可以使用<utl-pattern>;
高性能的web容器会缓存filter链,防止每次请求都要重新生成。
Filter和RequestDispatcher
2.4的规范中对filter新增了功能,通过配置使filter可以在request dispatcher的forward()及include()之下被调用的能力。
Filter的实例
网上非常多,这里就不写了。