李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
浅谈过滤器
Leefs
2019-10-28 PM
1382℃
0条
# 浅谈过滤器 ### 前言 在项目中过滤器(Filter)是很常用的,在本篇将对过滤器作一个简单介绍,在以后章节中将慢慢深入。 ### 一、过滤器(Filter)简单介绍 **Filter**在英文中也叫**过滤器**,使用Filter的主要目的就是完成过滤操作。可以在一个请求到达`servlet`之前,将其截取进行逻辑判断,然后决定是否放行到请求的`servlet`。也可以在一个`response`到达客户端之前,截取结果进行逻辑判断,然后决定是否允许返回给客户端。 (如下图所示) ![Filter过滤器01.png][1] Filter不是一个`servlet`,它不能产生一个response,但是它能能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。 换句话说,filter 其实是客户端与 servlet 中间的一个传递者,并且它可以对要传递 的东西进行修改。 ### 二、过滤器的简单代码实现 TestFilter实现Filter接口,并对其中的三个方法进行重写。 > 代码 ```java package filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "TestFilter") public class TestFilter implements Filter { public void destroy() { /*销毁时调用*/ } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/ chain.doFilter(req, resp);//交给下一个过滤器或servlet处理 } public void init(FilterConfig config) throws ServletException { /*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/ } } ``` ### 三、过滤器的原理 1. 1.当客户端发送请求后,在 HttpServletRequest 到达Servlet之前,过滤器对客户端的 HttpServletRequest 进行拦截。 2. 2.根据需要检查HttpServletRequest,同时可以修改 HttpServletRequest 中的头部和数据。 3. 3.在过滤器中调用 doFilter 方法,对请求放行。请求到达 Servlet 后,对请求进行处理并产生 HttpServletResponse 发送给客户端。 4. 4.在 HttpServletResponse 到达客户端之前,过滤器拦截 HttpServletResponse 。 5. 5.根据需要检查 HttpServletResponse ,可以修改 HttpServletResponse 头和数据。 6. 6.此时, HttpServletResponse 到达客户端。 ### 四、Filter方法说明 + 1.**init () 方法:**初始化参数,在创建 Filter 时自动调用。 在 web 应用程序启动时,web 服务器将根据web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中。Web容器创建 Filter 对象实例后,将立即调用该 Filter 对象的 init 方法。**init 方法在 Filter 生命周期中仅执行一次**,web 容器在调用 init 方法时,会传递一个包含 Filter 的配置和运行环境的 FilterConfig 对象 。 **利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。** + 2.**doFilter () 方法:**类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的 doFilter()方法。 其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;参数 chain 为代表当前 Filter 链的对象,在特定的操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的 chain.doFilter(request,response)方法才能把请求交付给 Filter 链中的下一个 Filter 或者目标 Servlet 程序去处理,也可以直接向客户端返回响应信息 。 + 3.**destroy () 方法:**在销毁 Filter 时自动调用。 ### 五、Filter的生命周期 **Filter的创建和销毁由web服务器控制。** - 1.服务器启动的时候,web 服务器创建 Filter 的实例对象,并调用其 init 方法,完成对象的初始化功能。filter 对象只会创建一次,init 方法也只会执行一次。 - 2.拦截到请求时,执行 doFilter 方法。可以执行多次。 - 3.服务器关闭时,web 服务器销毁 Filter 的实例对象。 *附:[参考文章链接1](http://blog.zh66.club/index.php/archives/30/)、[参考文章链接2](https://blog.csdn.net/yuzhiqiang_1993/article/details/81288912)* [1]: https://lilinchao.com/usr/uploads/2019/10/2493734340.png
标签:
Java
,
Filter
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/88.html
上一篇
如何在本地部署多个Tomcat服务
下一篇
创建内部类
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Jquery
稀疏数组
人工智能
Docker
Yarn
gorm
锁
数据结构
字符串
ClickHouse
Nacos
Http
DataWarehouse
递归
数据结构和算法
算法
RSA加解密
BurpSuite
Spark Core
Sentinel
Quartz
JavaSE
微服务
并发线程
Kafka
持有对象
MyBatis
Redis
SpringCloudAlibaba
Java
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞