天天看点

Servlet JSP 二重修炼:Filter过滤器前言过滤器案例代码解释Filter的设计后记

好久没写博客了。哈哈~宝刀未老呀,操起笔来准备11.11华华丽丽的来一篇。都说温故知新,这句话绝对正确。按着人的记忆曲线,温故是巩固记忆力的好办法。就像我还是经常翻翻自己写的博客。回头来看看到的是新的东西。那就足够了。

Servlet JSP 二重修炼:Filter过滤器前言过滤器案例代码解释Filter的设计后记

从右到左:人生境界也

什么是过滤器呢?

实过滤器(filter)和servlet很相似,都是java的组件。即请求发送servlet之前,可以用其截获和处理请求,也可以在serlvet

结束工作之后,在响应发回之前处理响应。因此,和上篇一样,过滤器filter是拦截请求,并对传给请求资源的servletrequest 或

servletresponse 进行处理的一个对象。如图:简单的描述其工作原理

Servlet JSP 二重修炼:Filter过滤器前言过滤器案例代码解释Filter的设计后记

过滤器做的事情

这是我们最希望做看到的事情,其实filter可以当成一个插件组件。它的作用于request和response之间。

请求过滤器的作用:

完成安全检查

重新格式化请求首部或者体

建立请求审计和日志

响应过滤器的作用:

压缩相应流

追加或者修改流

创建一个完全不同的响应

servlet

api中提供了一个filter接口,开发应用时,如果编写的java类实现了这个接口,则把这个java类称之为过滤器filter。filter的实

现类实现了一个j2ee的过滤器,过滤器的api允许访问servletcontext,同样可以链接到另一个filter。

filter类似于servlet一个样,有一个生命周期。里面有:init(), destroy(),还有个核心方法:dofilter()。

init(filterconfig):这是filter的初始化方法,servlet容器创建filter实例后将调用这个方法。在这个方法中可以读取web.xml文件中filter的初始化参数

dofilter(servletrequest,servletresponse,filterchain):

这个方法完成实际的过滤操作,当客户请求访问于filter关联的url时,servlet容器将先调用filter的dofilter方法。

filterchain参数用于访问后续filters

destroy():  servlet容器在销毁filter实例前调用该方法,这个方法中可以释放filter占用的资源

过滤器执行机制图:

Servlet JSP 二重修炼:Filter过滤器前言过滤器案例代码解释Filter的设计后记

此我们实现这个接口:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>public</code> <code>class</code> <code>demofilter</code><code>implements</code> <code>filter</code>

<code>{</code>

<code>    </code><code>@override</code>

<code>    </code><code>public</code> <code>void</code> <code>init(filterconfig filterconfig)</code><code>throws</code> <code>servletexception</code>

<code>    </code><code>{</code>

<code>    </code><code>}</code>

<code>    </code><code>public</code> <code>void</code> <code>dofilter(servletrequest request, servletresponse response,</code>

<code>            </code><code>filterchain chain)</code><code>throws</code> <code>ioexception, servletexception</code>

<code>        </code><code>chain.dofilter(request, response);</code>

<code>    </code><code>public</code> <code>void</code> <code>destroy()</code>

<code>        </code><code>//完成清理工作</code>

<code>}</code>

dofilter(servletrequest request, servletresponse response, filterchain chain)

大家主要看看这个参数:servletrequest /servletresponse

。这个方法不取http请求和相应对象做参数,而只是常规的servletrequest /servletresponse

对象。这里是对通用性的设计,过滤器的设计的要通用,如果过滤器用于一个非web应用,所以实现非http接口。但不用担心的

是,servletresponse 是httpservletresponse的超类。

从filter执行机制图,我们可以体会到其设计很像一个东西---”栈“。可以从我书中摘录的一张图片体会:filter3→filter7→serlveta→filter7→filter3

Servlet JSP 二重修炼:Filter过滤器前言过滤器案例代码解释Filter的设计后记

重读filter的积累。