一、过滤器简介

1、 过滤器是什么?

        Filter也称之为过滤器,过滤器是对数据进行过滤,预处理。开发人员可以对客户端提交的数据进行过滤处理,比如敏感词,也可以对服务端返回的数据进行处理。还有就是可以验证用户的登录情况,权限验证,对静态资源进行访问控制,没有登录或者是没有权限时是不能让用户直接访问这些资源的。类似的过滤器还有很多的功能,比如说编码,压缩服务端给客户端返回的各种数据,等等。

2、 过滤器的运作原理?

过滤器这么牛逼,那么它的运作原理是什么呢?
 java为我们提供了一个Filter接口,我们只需要实现这个接口就能实现自定义过滤器,然后添加一些必要的配置让过滤器生效。过滤器只能初始化一次,并且过滤器只会在项目停止或者是重新部署的时候才销毁。我们可以实现的这个Filter接口,里面最重要的是一个doFilter方法,当我们编写好Filter,并配置好对那个URL资源进行拦截时,每一次请求这个资源之前就会调用这个doFilter方法。并且在这个doFilter方法里面也有着一个FilterChain的对象参数 ,这个对象里面也有一个doFilter方法,是否调用这个方法决定了这个过滤器是否能调用后面的资源或者是执行后面的过滤器。也就是相当于目标资源。所以在过滤器里面可以进行一些什么操作呢?可以在调用目标资源之前,进行权限等的处理;判断是否调用目标资源;也可以在调用目标资源之后进行一些响应消息进行处理。


二、 Filter生命周期

  • 程序启动调用Filter的init()方法(永远只调用一次);
  • 程序停止调用Filter的destroy()方法(永远只调用一次);
  • doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用;
  • 不管第几次,都在调用doGet(),doPost()方法之前)。

三、过滤器配置的两种方法

1. 注解配置

首先我们定义一个MyFilter 实现Filter接口。重写里面的三个方法

@Order(1)
@WebFilter(filterName = "myFilter1",urlPatterns = {"/*"})
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("进入目标资源之前先干点啥");filterChain.doFilter(servletRequest,servletResponse);System.out.println("处理一下服务端返回的response");}@Overridepublic void destroy() {System.out.println("过滤器被销毁了");}

代码说明:

 1.@WebFilter注解,filterName属性表示filter的名称,urlPatter表示要拦截的URL资源,可以是一个或者多个。

 2.@Order(1)表示如果有多个拦截器的话就是设置这个拦截器的运行等级,数字越小,越先执行

 3.init()方法只会执行一次,初始化过滤器。

 4.doFilter()核心方法,配置过滤器的逻辑代码。

 5.destroy()只会在项目停止或者是项目重新部署的时候才会执行。

 配置完上面的之后我们还需要在启动类加上一个扫描包的注解,开启包扫描。@ServletComponentScan("com.example.demofilter.filter"),当然你也可以不用写包的具体地址,不传参数,但是建议是传参数,并且这个采参数也可以传多个的。

 以上就完成了一个Filter的基本配置,运行项目即可看到效果,还有一种非注解形式的配置方式。

2. java配置

我们可以通过自己定义一个java配置文件,将自定义的Filter 注册到到FilterRegistrationBean里面

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean registFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(new MyFilter());registrationBean.addUrlPatterns("/*");registrationBean.setName("Filter1");registrationBean.setOrder(1);return registrationBean;}
}

这个配置和上面的注解配置类似。上面注解实现的原理也是这样的,虽然是两种不同的方法,但是是一样的原理。

3. 测试编写与结果

controller代码编写

@RestController
@RequestMapping("/Filter")
public class FilterController {@RequestMapping("/testFilter")public String testFilter(){System.out.println("filter执行成功");return "filter";}
}

完成之后启动项目,访问接口:localhost:8098/Filter/testFilter,观察控制台运行结果。

 根据之前我们说的,过滤器只会执行一次,然后过滤器也只会在项目停止或者是重新部署的时候才会销毁,所以我们是看不到销毁的代码输出出来。


四、使用场景

1)过滤敏感词汇(防止sql注入)
2)设置字符编码
3)URL级别的权限访问控制
4)压缩响应信息

Spring Boot (Filter)过滤器的实现以及使用场景相关推荐

  1. Spring Boot Filter过滤器 实现登录

    Spring Boot Filter过滤器 实现登录 Filter类 package com.citi.test;import java.io.IOException;import javax.ser ...

  2. spring boot Filter过滤器的简单使用

    springboot使用Filter过滤器有两种方式: 一种是实现Filter接口然后通过@Component注解向项目加入过滤器 另一种是通过配置类来配置过滤器 @Component public ...

  3. spring boot filter配置方式

    spring boot 加载外部filter方式 spring boot filter两种配置方式 1.自定义filter配置 2.加载外部jar包配置 spring boot filter两种配置方 ...

  4. 在Spring boot 配置过滤器(filter)

    在spring boot 配置servlet filter 逻辑上与配置spring 是一样的. 不过相比spring 更加简化配置的难度. 这里只需要两步 1 创建一个自定义顾虑器并继承spring ...

  5. spring boot 自定义过滤器链

    spring boot 会按照order值的大小,从大到小的顺序来依次过滤. 贴下代码: package com.osp.ucenter;import org.springframework.boot ...

  6. spring boot 使用过滤器过滤非法字符

    有时候我们要配置我们自己的定义非法字符过滤,但 HttpServletRequest 对象是不可以改变的,那我们只好定义一个类,成为它的子类,重写它的方法,这样在Servelt中使用它方法时候, 就会 ...

  7. Spring Boot使用过滤器过滤非法URL

    一.场景 使用Spring Boot框架,通过过滤器过滤不存在的URL,将这些非法URL转发或重定向到自定义错误页面. 二.实现 API: WebApplicationContext:用于获取全局信息 ...

  8. Spring Boot filter

    在Spring Boot中自定义filter 本文我们将会讲解如何在Spring Boot中自定义filter并指定执行顺序. 定义Filter很简单,我们只需要实现Filter接口即可,同时我们可指 ...

  9. 【Spring Boot】 过滤器、监听器、拦截器的使用

    概念和使用场景 监听器 listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件. 实 ...

最新文章

  1. POJ3270 Cow Sorting ——置换群
  2. 开发笔记:游戏逻辑模块组织及数据同步
  3. sap.ui.require in SAP UI5 and require in nodejs
  4. 鸿蒙有安卓内核吗,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  5. 程序员的算法课(10)-字符串排序算法实例(纯代码)
  6. .Net读取rss的两种方法
  7. [原创] Jenkins slave agent 分布式构建
  8. 设计模式学习之---Facade(外观)模式
  9. pandas如何保存在excel里面_别找了,这是 Pandas 最详细教程了
  10. 必读的android 文章- 收藏集 - 掘金
  11. 手把手带你搭建Linux环境(保姆级,包含vivado与petalinux)
  12. C++ 依赖倒置原则
  13. 一张图学《计算机组成原理(硬件篇)》 思维导图 计算机组成
  14. 关于opencv的rows和cols的理解
  15. GPS 入门 6 —— 各国卫星导航系统比较(北斗、伽利略、GLONASS、GPS)(转)
  16. Don’t Miss the Labels: Label-semantic Augmented Meta-Learner for Few-Shot Text Classification
  17. 爱的杂篇--掉掉眼泪
  18. 计算机基本原理问答题及答案
  19. PC浏览器添加背景音乐 VS 手机浏览器添加背景音乐
  20. endnote 教程

热门文章

  1. 直播回顾 | 云原生混部系统 Koordinator 架构详解(附完整PPT)
  2. 高光谱图像分析:分类 II
  3. 团队-中国象棋游戏-设计文档
  4. sa387gr11cl2是什么材料,sa387gr11cl2美标钢板性能介绍
  5. top 命令参数使用说明
  6. FileReader和FileOutputStream
  7. 最短路构造最短路95 C. Volleyball
  8. 微信小程序:本地存储数据
  9. Go(Golang)_12_竞态
  10. 条件随机场(CRF)原理和实现