Filter过滤器
- 熟悉的关键字-Filter(回顾-联系-可以不看)
- Filter概述
- 何时使用?
- Filter生命周期
- 过滤器单个实现
- doFilter方法
- 关于Filter的配置路径
- Filter的执行顺序
- 在`web.xml`文件中进行配置的时候,`Filter`的执行顺序是什么?
- 使用WebFilter注解配置时,Filter的执行顺序是什么?
- 过滤器的调用顺序
- 职责链设计模式
- Filter运用
熟悉的关键字-Filter(回顾-联系-可以不看)
filter这个关键字在JavaSE中jdk1.8新特性stream流中的方法中是出现过:
Stream filter(Predicate<? super T> predicate);
这个方法返回一个子集流,过滤掉不满足条件的数据,返回符合条件的数据,非终端方法。
通过它可以直观的猜测这个关键字是和过滤数据有关系的。
Filter概述
Filter是过滤器;Filter是Servlet高级特性之一,实际就是实现Filter接口的Java类,主要还是Java程序;- 可以把
Servlet程序看作是一个最终要执行的目标,可以使用过滤器Filter来添加过滤代码,这个过滤代码可以添加到Servlet执行之前,也可以添加到Servlet执行之后,Filter可以做到在Servlet这个目标程序执行之前过滤,也可以在目标程序执行之后过滤; - 一般情况下,都是在过滤器当中编写公共代码;
- 学
Filter之前发送请求访问Servlet:

(可以看到三个Servlet都写了判断登录的代码,代码重复写,没有达到代码复用的效果)
- 学
Filter之后发送请求访问Servlet可以是以下这样的:

(经不经过过滤器看路径,先走过滤器再去寻资源,一个项目里面可以有多个过滤器,一个请求也可能经过多个过滤器再到所需资源)
过滤器在WEB容器中哪里?

何时使用?
只能说Filter过滤器功能很强大!!!
- 需要限制用户访问某些资源时;
- 需要处理请求时先处理某些资源时;
- 需要对服务器响应的内容处理后再响应时。
Filter生命周期
和Servlet生命周期一致。
唯一的区别:Filter默认情况下,在服务器启动阶段就实例化,而Servlet不会,Servlet是默认根据请求来的。
过滤器单个实现
- 编写一个
Java类实现一个接口:Jakarta.servlet.Filter,并且实现这个接口当中的所有方法;
init方法:在Filter对象第一次被创建之后调用,并且只调用一次;(默认方法)
doFilter方法:只要用户发送一次请求,则执行一次;
destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。(默认方法)如果
init和destroy方法没有特殊使用,子类可以不重写,它们俩是默认方法;Filter可以称为函数式接口!
doFilter方法
三个方法中一个doFilter方法是特殊的,(其他俩个和Servlet中是一致的)。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
doFilter前俩参数是ServletRequest和ServletResponse对象,可以看到这是面向接口编程,可以实现任何协议的过滤操作!!!
第三个参数FilterChain是Servlet中没有的。

- 该
FilterChain接口是由WEB容器实现的,我们只管使用即可!!!
下面是使用描述:

- 在
web.xml文件中对Filter进行配置或者利用注解(@WebFilter)进行配置,这个配置和Servlet很像;
注意:
Servlet对象默认情况下,在服务器启动的时候是不会新建对象的,Filter对象默认情况下,在服务器启动的时候会新建对象。另外Servlet是单例的,Filter也是单例的!!!

或

目标Servlet是否执行,取决于两个条件:
- 第一:在过滤器当中是否编写了:
chain.doFilter(request,response);代码; - 第二:用户发送的请求路径是否和
Servlet的请求路径一致。
chain.doFilter(request,response);这行代码的作用:
执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet。
注意:Filter的优先级天生就比Servlet优先级高;所以当路径一致是优先执行的是Filter,是否执行Servlet取决于以上写的那两个条件!!!
关于Filter的配置路径
- 精确匹配(/a.do,/b.do,/oa/list…)
- 匹配所有路径(
/*) - 后缀匹配,不要以
/开始(*.do) - 前缀匹配,要以
/开始(/dept/*)
Filter的执行顺序
在web.xml文件中进行配置的时候,Filter的执行顺序是什么?
依靠
filter-mapping标签的配置位置,越靠上优先级越高。
使用WebFilter注解配置时,Filter的执行顺序是什么?
比较Filter实现类的类名。
比如FilterA和FilterB,则先执行FilterA;
比如Filter1和Filter2,则先执行Filter1;
过滤器的调用顺序
遵循栈数据结构。
职责链设计模式
Filter过滤器这里有一个设计模式:职责链设计模式(也叫责任链设计模式);
过滤器最大的优点:
-
在程序编译阶段不会确定调用程序,因为
Filter的调用顺序是配置到web.xml文件中,只要修改web.xml配置文件中filter.mapping标签的顺序就可以调整Filter的执行顺序,显然Filter的执行顺序是在程序运行阶段动态组合的,那么这种设计模式被称为职责链设计模式。 -
职责链设计模式最大的核心思想:
在程序运行阶段,动态的组合程序的调用顺序。
Filter运用
可以看看我Gitee中的oa3,里面有通过Filter改进后的CRUD!
使用Filter改进oa3

![[附源码]Python计算机毕业设计Django停车场管理系统](https://img-blog.csdnimg.cn/df62cacc4c64437db2c5d3cb9bf20d97.png)
















