一. web过滤器的介绍
1.过滤器
在生活中,过滤这种我们时常可见;比如水资源的处理,化学药剂的提取等等。所谓过滤,就是指对某事物的处理进行一定的处理获取相应的结果的一个过程。它可以总结为下:
过滤源==>过滤规则==>过滤结果
过滤源:需要过滤的东西
过滤规则:对过滤东西的处理
过滤结果:经过过滤后所得的东西
2.web过滤器
过滤器在web中的应用定义
过滤器 是一个服务器端的组件,它可以截取用户端的请求和响应信息,并对这些信息过滤。
3.web过滤器的工作原理
在没有过滤器的情况下,用户的请求可以直接进行访问服务器web资源
在存在过滤器的情况下,客户端的请求是不能直接访问服务器端web资源。
过滤器的具体工作原理:
过滤器在web程序启动的时候便会进行加载。用户发送请求并不是直接到web资源,而是先到过滤器;过滤器判断我们的请求是否合法、是否符合规则;符合规则后过滤器再将用户请求发送到web资源;web资源处理完信息响应到过滤器;过滤器再将web资源的响应发送给用户
3.web过滤器的生命周期
web的生命周期分为四种
- 实例化:在web程序启动的时候,通过web.xml文件中的配置去加载过滤器。只会实例化一次。
- 初始化:启动后,会进入到初始化。会调用
init()
方法加载初始化信息。只执行一次。 - 过滤:过滤器每次捕获到请求都会执行过滤方法
doFilter()
。可执行多次。 - 销毁:web容器关闭的时候执行
destory()
方法销毁过滤器对象。
4.web过滤器中的方法
-
init()
:过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法,这个方法可以读取web.xml文件中过滤器的参数。 -
doFilter()
:这个方法完成实际的过滤操作,想过滤器的核心方法。当用户访问请求与过滤器关联的URL时,web容器将先调用过滤器的doFilter()
方法。FilterChain
参数可以调用chain.doFilter()
方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求转发到其他资源。 -
destroy()
:web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)
二.过滤器简单案例
1.创建web项目。并创建一个类实现Filter接口
2.在web.xml中配置过滤器
<!-- ……………… -->
<!-- Filter配置 -->
<filter>
<filter-name>Filter名字</filter-name>
<filter-class>Filter的完整类名称</filter-class>
<description>描述信息</description>
<init-param>
<param-name>参数名称</param-name>
<param-name>参数的值</param-name>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter名字</filter-name>
<url-pattern>URL</url-pattern>
<dispatcher></dispatcher>
</filter-mapping>
<!-- ……………… -->
注意:
-
filter-class
:必须是类的全路径(即包括报名) -
init-param
:初始化参数,可以是零对或者多对 -
url-pattern
:当用户请求的URL和指定的URL路径相匹配时,将触发过滤器工作 -
dispatcher
:指定过滤器所拦截资源被Servlet容器调用的方式。可以使REQUEST
,INCLUDE
,FORWARD
和ERROR
之一,默认是REQUEST
3.在类中写输出数据测试
在Filter的实现类中的方法中写入输出数据,在
index.jsp
中前面增加输出。方便之后看到过滤器执行耳朵顺序。
4.启动服务器,访问index.jsp页面
访问https://http://127.0.0.1:8080/Filter/
后仔细观察运行结果
所以可以总结Filter实现类中方法的运行顺序为:
构造器==> init() ==> doFilter() ==>…………==> destroy()
在执行doFilter()
方法时,chain.doFilter()
方法将请求传给了index.jsp
,最后才输出end……doFilter
面试题两点:
1.过滤器可以更改用户请求的路径
2.过滤器不能直接处理用户请求的数据,也不能直接返回数据
三.过滤器链
1.过滤器链
过滤器链:指针对一个用户请求,而根据路径所匹配到的过滤器有多个。这时候用户请求就会依次通过各个过滤器到达web资源。
2.过滤器链的执行顺序以及原理
服务器会按照
web.xml
文件中过滤器定义的先后顺序组装成一条过滤器链。通过doFilter()
方法依次执行后面的过滤器直至所有过滤器执行完毕后访问到web资源。