一、概念
(一)什么是Filter
Filter是服务器端的组件,用来过滤web请求。
流程是这样的,当一个web请求进来时,web容器会先检查请求的URL是否设置了Filter,如果设置了,则执行该Filter的doFilter方法。所有Filter都实现了javax.servlet.Filter接口,doFilter是定义在该接口中的最重要的方法。
Filter其实本质就是个实现Filter接口的Java类罢了!
(二)Filter的作用
当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些通用的操作。如:登录验证、统一编码处理、敏感字符过滤,等等…
(三)Filter所处的位置
二、Filter快速入门Demo
(一)步骤
1、定义一个类,实现Filter接口
2、实现Filter接口中的三个方法
3、配置Filter的拦截路径
(二)Demo如下
1 | "/*") ( |
三、Filter的生命周期方法
1、init():在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
2、doFilter():每一次请求被拦截资源时,会执行。执行多次
3、destroy():在服务器关闭后,Filter对象被销毁,然后会执行destroy方法。只执行一次。用于释放资源
四、Filter的配置
(一)配置方式
1、方式一:在web.xml中进行配置
如:上面的入门Demo就可以在web.xml中使用如下方式进行配置
1 | <filter> |
2、方式二:使用注解的方式进行配置
如:上面的快速入门Demo就是使用的该种方式进行的配置
(二)拦截路径配置
一共有5种拦截路径,如下:
1、具体资源路径:
1 | 2、拦截目录: |
3、后缀名拦截:
1 | 4、拦截所有资源: |
(三)拦截方式配置:资源被访问的方式
1、使用注解方式配置时:
1 | 设置dispatcherTypes属性 |
1 | -- 拦截浏览器直接请求的资源 |
2、使用web.xml进行配置时:
设置<dispatcher></dispatcher>
标签即可
五、Filter的执行流程
现有一个index.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
创建一个如下的Filter进行测试
1 | "/*") ( |
测试结果为:
由此总结Filter的执行流程为:
1、执行过滤器
2、执行放行后请求的资源
3、回来执行过滤器放行代码下边的代码
六、过滤器链
当有多个过滤器时,就构成了过滤器链。
(一)执行优先级
那么当有多个过滤器时,如何确定每个过滤器的执行优先级呢???
这其实和Filter的配置方式有关:
1、在web.xml文件中配置则由mapping的先后顺序决定,如果放在前面就先执行,放在后面就后执行
1 | <filter-mapping> |
如此时,则Demo3会先于Demo4执行。
2、如果是通过注解的方式配置,就比较urlPatterns的字符串优先级
如此时,则Demo3会先于Demo4执行。
(二)过滤器链执行顺序
以两个过滤器为例,测试其执行顺序:
分别有两个使用注解方式配置的Filter
FilterDemo6
1 | "/index.jsp") ( |
FilterDemo7
1 | "/index.jsp") ( |
访问的资源还是前面的index.jsp,测试结果如下:
执行顺序是这样的:
先执行FilterDemo6,放行
执行FilterDemo7,放行
请求index.jsp
index.jsp请求完后回到FilterDemo7上
FilterDemo7执行完毕后,回到FilterDemo6上
更详细的总结:过滤器入门看这一篇就够了(修订版)
Java新手,若有错误,欢迎指正!