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