一、什么是过滤器

Filter称之为过滤器,是SerlvetAPI提供的一个Filter接口,A类实现了这个接口,那么A类称之为过滤器Filter。主要用户的请求(HttpServletRequest)进行预处理,也可以对服务器响应后的数据进行处理。也就是在请求到达服务器处理之前进行拦截,将过滤后符号条件的数据交给服务器进行处理生成响应,最后Filter再对服务器响应的数据进行处理。

下面以登录权限的验证为例子:用户在没有登录的情况下,是不允许查看html,jsp的界面等等。拦截器在请求到达服务器之前拦截浏览器的请求,如果用户已经登录就让其访问资源。没有登录就会跳转到登录界面需要登录。

二、过滤器的功能是什么

在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。

在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

三、Filter过滤器实现原理和实现过程

Filter过滤器使用步骤:1.编写一个类去实现Filter接口。2.实现过滤方法doFilter()。3.到web.xml中去配置Filter拦截路径

①Filter接口中有三个方法

   分别是初始化方法init()、拦截方法doFilter()、销毁方法destory();其中doFilter方法是web服务器在调用service()或者doGet()或者doPost方法之前,web服务器对应用程序配置文件进行检查,配置文件有<filter><filter-mapping>配置项的时候,然后再去过滤器类进行doFilter()方法中进行拦截。

下面是拦截器类的三个方法。

public class Filter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic void destroy() {}
}

   ②web.xml的配置和<url-pattern>的配置说明

 <!-- 使用filter标签配置一个filter过滤器 --><filter><!-- 给Filter起一个别名 --><filter-name>AdminFilter</filter-name><!-- 配置filter的全路径 --><filter-class>com.comon.filter.AdminFilter</filter-class></filter><!-- 配置拦截路径 --><filter-mapping><!-- 表示当前的拦截路径给哪一个 filter使用 --><filter-name>AdminFilter</filter-name><!-- 配置拦截路径/:表示从http://ip:port/工程路径/ 映射到idea下的web目录/admin/*:表示请求地址为  http://ip:port/工程路径/admin/*--><url-pattern>/admin/*</url-pattern></filter-mapping>

③关于Filter过滤器拦截路径<url-pattern>的说明

  • 精准匹配 :精确的描述需要拦截的文件

<url-pattern>/target.jsp</url-pattern>,以上的配置路径,表示请求必须为:http://ip:port/工程路径/target.jsp

  • 目录匹配:对文件夹中的文件信息拦截

<url-pattern>/admin/*</url-pattern>,以上的配置路径,表示请求必须为:http://ip:port/工程路径/admin/*

  • 后缀名配置:*号开头,表示请求地址必须以.html结尾才会被拦截到

<url-pattern>*.html</url-pattern>,以上的配置路径,表示请求必须为:http://ip:port/工程路径/a.html

四、Filter的生命周期

简单来说Filter过滤器包含了以下四个阶段

  1. 构造器方法
  2. init()初始化方法

第1,2步骤,在web工程启动的时候执行(Filter过滤器已经创建)

3. doFilter()过滤方法,每次拦截请求就会执行

4.destory()销毁,在停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)

/*
初始化
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,
完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。*/
public void init(FilterConfig filterConfig) throws ServletException;/*
拦截请求
这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;/*
销毁
Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载
Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
*/
public void destroy();

五、FilterChain过滤器链

FilterChain过滤器链就是多个过滤器一起工作。

看图分析:

浏览器发出请求到服务器,在获取服务器的资源之前,首先经过过滤器Filter1,对请求进行拦截后,在经过过滤器Filter2,经过前置代码的过滤符合条件后可以访问目标资源。最后将目标资源经过后置代码的过滤后返回给客户端。 这里需要注意,过滤器执行的优先顺序是由web.xml中从上到下的顺序决定的。

六、总结

现在大家对于Filter过滤器有一个比较全面的认识,但是在开发中还存在着很多细节的问题有待解决。

Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

  Filter的生命周期和Servlet一样,Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。注意:init方法与destroy方法只会直接一次。

坚持积累,所谓天才,不过是平时的坚持罢了。
 

【全面详解】Filter过滤器的使用相关推荐

  1. 【redis】详解布隆过滤器BloomFilter的原理,使用场景和注意事项

    文章目录 1. 什么是布隆过滤器 2. 实现原理 2.1 HashMap 的问题 2.2 布隆过滤器数据结构 2.3 BloomFilter 的缺点 2.4 如何选择哈希函数个数和布隆过滤器长度 3. ...

  2. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  3. 详解布隆过滤器的原理、使用场景和注意事项

    在进入正文之前,之前看到的有句话我觉得说得很好: Data structures are nothing different. They are like the bookshelves of you ...

  4. SpringBoot重点详解--使用过滤器映射访问路径

    目录 添加Maven依赖 配置地址映射 MapsApplication应用启动类 MapsInitializeListener初始化监听器 MapsUtils工具类 MapsFilter过滤器 Map ...

  5. 详解布隆过滤器的原理和实现

    为什么需要布隆过滤器 想象一下遇到下面的场景你会如何处理: 手机号是否重复注册 用户是否参与过某秒杀活动 伪造请求大量 id 查询不存在的记录,此时缓存未命中,如何避免缓存穿透 针对以上问题常规做法是 ...

  6. JAVA8 Stream方法使用详解Filter、map等用法(一)

    文章目录 一.筛选和切片 1.谓词筛选filter 2.筛选不同的元素distinct 3.截断流limit 4.跳过元素 二.映射 1.map对每个元素应用函数 2.流的扁平化 三.查找和匹配 1. ...

  7. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项

    今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 "布隆过滤器原理都不懂,还要我优化?".技术菜被人怼认了.怪不 ...

  8. [转]布隆过滤器详解

    布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中.在垃圾邮件过滤 ...

  9. HBase的布隆过滤器详解

    HBase的布隆过滤器详解 1.布隆过滤器的简单介绍 2.布隆过滤器的原理分析 2.1 哈希表存在的问题 2.2 布隆过滤器的原理 2.2.1 原理详解 2.2.2 布隆过滤器失误率的调节 2.2.3 ...

  10. Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01

    目录 1. Swagger 1.1 介绍 1.2 Swagger 的优势 1.3 简单使用 1.3.1 集成 Swagger 管理 API 文档 1.3.2 在线测试接口 1.4 常用注解 1.5 参 ...

最新文章

  1. 深入研究自监督单目深度估计:Monodepth2
  2. R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)、输出异常值对应的统计量、p值以及Bonferonnii校正p值
  3. python官网下载步骤视频-Python 实现视频下载
  4. boost::stl_interfaces模块实现最小的随机访问迭代器的测试程序
  5. 众所周知,YouTube是个学习网站
  6. 让你的数据和对象有源有出路,一文打尽,Java常用IO流处理流(处理字节流文件流)缓冲流、转换流、对象流等
  7. python实战===生成随机数
  8. How to create a hyperlink in SQL Server Reporting Services
  9. AcWing基础算法课Level-2 第三讲 搜索与图论
  10. python机器学习库sklearn——集成方法(Bagging、Boosting、随机森林RF、AdaBoost、GBDT)
  11. Ribbon和Feign的对比-带简易例子
  12. 仓库货位 mysql_Max(TM)财务进销存管理系统 V1.1.12 MySQL网络版
  13. [ECE]模拟试题-6
  14. 鸿蒙app学习笔记一
  15. 蟋蟀蝙蝠的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. 关于有刷直流电机,你需要了解这些
  17. 非常可乐(三个杯子倒水问题)
  18. 几何运算是计算机的基本功能,渐开线圆柱齿轮几何参数计算的计算机辅助设计系统...
  19. centos php服务器搭建教程,CentOS搭建PHP服务器环境简明教程
  20. 中国卸妆产品市场盈利模式及十四五投资前景预测报告2021年版

热门文章

  1. java使用emqtt实现即时聊天_emqttd java代码测试
  2. android手机普及度,为什么有人认为全面屏手机的普及率比较低,有何依据?
  3. PointNet++论文及代码详解
  4. S32DS project explorer文件夹屏蔽问题
  5. linux命令查硬盘wwn,Linux系统查看wwn号的技巧
  6. i7 11700和i7 11700k的区别 i7 11700和i7 11700k的差距大吗
  7. Hyperledger Indy项目(开源去中心化身份平台)、去中心化身份(DID)、分布式数字身份项目
  8. python直方图拟合曲线_关于matplotlib:Python高斯拟合颜色与直方图条形相同
  9. Matplotlib.pyplot参数(条形图,直方图,饼图,散点图)
  10. java word转pdf,可以解决转pdf后word横版变窄问题(pdf显示不全)