读书人

Servlet学习收拾(五) filter

发布时间: 2013-01-05 15:20:39 作者: rapoo

Servlet学习整理(五)—— filter
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的实例

网上非常多,这里就不写了。

?

?

?

?

?

?

?

?

?

?

?

读书人网 >互联网

热点推荐