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的实例

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

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值