李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
浅谈过滤器
Leefs
2019-10-28 PM
2001℃
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://lilinchao.com/archives/88.html
上一篇
如何在本地部署多个Tomcat服务
下一篇
创建内部类
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
ClickHouse
Java阻塞队列
排序
工具
递归
Java编程思想
数据结构和算法
SpringCloud
Spark Core
Eclipse
Elastisearch
栈
容器深入研究
Java
DataWarehouse
Spark Streaming
链表
RSA加解密
随笔
Stream流
Typora
设计模式
JVM
Spring
国产数据库改造
数据结构
序列化和反序列化
并发线程
Flink
VUE
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭