Web中的过滤器

web中的过滤器

1.概念
Filter,过滤器的意思,在web中是对客户端访问资源的过滤,符合条件放行,不符合条件过滤。

在Java里肯定会有一个类或者接口与其对应,因为有制定规则的作用,在这儿对应的是接口。

下面让我们来看Filter接口源码:
Web中的过滤器
从图中我们可以看到有三个方法,下面一一介绍:
(1)init()方法
初始化的意思,其有一个参数FilterConfig,这也很好理解,初始化的时候需要获取配置信息。
(2)doFilter()方法
毫无疑问,核心方法就在该方法中。具体要怎么过滤,肯定也就是对该方法的重写。
(3)destory()方法
摧毁的意思,这不用多说,当服务器停止运行的时候,就会调用该方法。

2.过滤器两种实现方式
Filter和Servlet一样,有xml配置文件和注解两种实现方式。
(1).xml配置文件
Web中的过滤器
1.web.xml
这个就和servlet配置是一样的,只不过标签名称换成了filter。

filter-name自己定,要保证两个都是一样的。

filter-class是自定义类的类名+包名。

url-pattern即映射路径,对应浏览器地址。

2.自定义一个类FilterOne
这个类用于实现Filter接口,这样便能达到一个过滤的效果:web.xml配置信息中的映射路径就被过滤掉了。

其中关于FileChain,他是Java中的一个接口,源码如下:
Web中的过滤器
该接口是是Filter接口中的doFilter()方法中一个参数,其中该接口也有一个方法doFilter()。

注意不要讲这两个doFilter()方法弄混。
filterChain.doFilter()这段代码的执行也就是放行的意思,若是这段代码,过滤将会无效。

关于FilterChain接口,在第三点将会详解说明。

3.测试
创建两个文件:FilterOne.html和FilterTwo.html,其中FilterOne.html对应于web.xml中的映射路径。

当浏览器访问FilterOne.html的时候,没有输出,因为文件被过滤了。
当浏览器访问FilterTwo.htm的时候,有输出,因为文件没有被过滤。

(2)注解实现方式
Web中的过滤器
操作步骤和Servlet一样:
方便之处在于:无须再web.xml文件中进行配置
Web中的过滤器

其中关于FilterChain的doFilter方法
1.不写doFilter()方法,文件访问不到,被拦截。
2.写doFilter()方法,文件可以被访问,被放行。
3.所以doFilter()具有放行的作用。

3.过滤器的执行流程

同一路径下是不能对应多个Servlet的,那同一路径下可以对应多个Filter么?

答案是可以的,其实也好理解,就是多个过滤条件判断得到一个结果。

那么它们的执行流程又是怎么样的呢?

就得弄懂FilterChain接口及其doFilter()的作用了。先写代码做一个测试:
Web中的过滤器
(1)三个过滤器
创建了FilterA、B、C三个过滤器,上图只展示了一个。

在代码中编写两条输出语句用来判断执行顺序,以FilterChain的doFilter()方法为界。

(2)过滤器要过滤的资源
用Servlet来作为被过滤的资源,路径和三个过滤器路径一样。

代码测试:
Web中的过滤器
根据运行结果我们可以判断其执行顺序是按照英文字母顺序排列的,所以FilterA在前面。

至于对FilterChain的理解:

Chain本身就有链条的意思,以FilterChain的doFilter()方法为界限,其执行流程就像是链条一样。