当前位置: 首页 > news >正文

过滤器(Filter)

过滤器(Filter)

1. 基本概念

过滤器(Filter)是拦截 Request 请求的对象:在用户的请求访问资源前处理 ServletRequest 和 ServletResponse 。

Filter 相关的接口有:Filter、FilterConfig、FilterChain 。

Filter 的实现必须实现 Filter 接口。这个接口包含了 Filter 的3个生命周期方法:init()doFilter()destroy()

Servlet 容器(Tomcat)初始化Filter时,会触发 Filter 的 init() 方法,一般来说是在应用开始时(注意,不是第一次使用时)。这个方法只会被调用一次。

FilterConfig 对象由 Servlet 容器传入 init() 方法中。

当 Servlet 容器每次处理 Filter 相关的资源时,都会调用该 Filter 实例的 doFilter() 方法。就像容器调用 Serviet 的 service() 方法。

在 Filter 的 doFilter() 方法中,最后一行需要调用 FilterChain 中的 doChain() 方法。注意,FilterChain 是 doFilter() 方法的第三个参数。

一个 URL 资源可能被多个 Filter 关联(即一条 Filter 链),这时 Filter.doFilter() 的方法将触发 Filter 链中下一个 Filter。只有在 Filter 链中最后一个 Filter 里调用 doFilter() 方法,才会触发 Controller 中处理 URL 资源的方法。

如果在 Filter 的 doFilter() 方法中,因为故意(或无意)没有调用 FilterChain 的 doFilter() 方法,那么这个 Request 请求将终止,后面的处理就会中断。

注意,FilterChain 接口中,唯一的方法就是 doFilter() 方法,它和 Filter 接口中的 doFilter() 方法定义是不一样的。

Filter 接口中,最后一个方法是 destroy(),该方法在 Servlet 容器要销毁 Filter 时触发。

类似于 Servlet,Filter 也是单例。

2. Filter 的配置

和 Servlet 的配置非常相似,Filter 的配置主要有三方面:

  • 确认哪些资源需要本 Filter 进行拦截处理。
  • 配置 Filter 的初始化参数和值,这些参数在 Filter 的 init() 方法中可以读取到。
  • 给 Filter 取一个名称(一般来说这个配置是不需要的)。在一些特殊的情况下,系统通过这个名字来识别Filter。
@WebFilter(filterName = "firstFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name="", value=""),@WebInitParam(name="", value="")})
public class FirstFilter implements Filter {...
}
<filter><filter-name>firstFilter</filter-name><filter-class>com.hemiao.filter.FirstFilter</filter-class><init-param><param-name>author</param-name><param-value>ben</param-value></init-param><init-param><param-name>email</param-name><param-value>hemiao3000@126.com</param-value></init-param>
</filter>
<filter-mapping><filter-name>firstFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
http://www.lryc.cn/news/306983.html

相关文章:

  • AMRT3D数字孪生引擎详解
  • Sqlite数据库详解
  • 基于YOLOv8深度学习+Pyqt5的电动车头盔佩戴检测系统
  • 【数据结构】B树,B+树,B*树
  • 常用实验室器皿耐硝酸盐酸进口PFA材质容量瓶螺纹盖密封效果好
  • 【kubernetes】二进制部署k8s集群之cni网络插件flannel和calico工作原理
  • Pycharm一直打不开,无任何报错
  • 用html编写的小广告板
  • hive中如何取交集并集和差集
  • 2024.2.26
  • 【kubernetes】关于k8s集群的声明式管理资源
  • 8.openEuler操作系统网络管理和防火墙(二)
  • 1904_ARM Cortex M系列芯片特性小结
  • 热闹元宵进行中,如何利用VR全景展示民宿品牌形象?
  • css3实现无缝滚动,鼠标经过暂停
  • SpringCache缓存专题
  • Doris实战——结合Flink构建极速易用的实时数仓
  • 阿里开源低代码引擎 - Low-Code Engine
  • 2024-02-23(Spark)
  • 【JavaSE】实用类——枚举类型、包装类、数学类
  • Qt中常见的JS类和函数(二): 全局对象
  • mysql 安装 与 使用
  • 2月26日做题总结(C/C++真题)
  • 创作纪念日:记录我的成长与收获
  • 全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法
  • excel数据导入到数据库的方法
  • Runaway Queries 管理:提升 TiDB 稳定性的智能引擎
  • K8S部署Java项目(Gitlab CI/CD自动化部署终极版)
  • 对Redis锁延期的一些讨论与思考
  • 【高德地图】Android高德地图初始化定位并显示小蓝点