26

SpringBoot系列(十二)过滤器配置详解

 4 years ago
source link: http://www.cnblogs.com/swzx-1213/p/12814734.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SpringBoot(十二)过滤器详解

SpringBoot系列(二)入门知识

springBoot系列(三)配置文件详解

SpringBoot系列(四)web静态资源配置详解

SpringBoot系列(五)Mybatis整合完整详细版

SpringBoot系列(六)集成thymeleaf详解版

Springboot系列(七) 集成接口文档swagger,使用,测试

SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式

SpringBoot系列(九)单,多文件上传的正确姿势

SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

目录

1. 过滤器简介

1. 过滤器是什么?

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

2. 过滤器的运作原理?

过滤器这么牛逼,那么它的 运作 原理是什么呢?

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

2. 过滤器配置的两种方法

1. 注解配置

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

@Order(1)
@WebFilter(filterName = "myFilter1",urlPatterns = {"/*"})
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入目标资源之前先干点啥");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("处理一下服务端返回的response");
    }

    @Override
    public 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 {
    @Bean
    public 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,观察控制台运行结果。

JRNZfin.png!web

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

4. 总结

本文先讲解了过滤器的一些概念,用途,然后详细讲解了过滤器的在SpringBoot中的配置与使用,我们介绍了两种配置方法,分别是注解方式与java 代码的配置。之后进行测试,与结果展示。如果你觉得本文对你有用,可以点个关注哦!


Recommend

  • 65

    前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏高词汇、访问权限控制(URL级别)等业务需求。这些对于业务来说一般上是无关的,业务方是无需关系的,业务只需要关系自己内部...

  • 34

    Q:使用过滤器、拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种“加强版”,它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链。Filter也可以对

  • 12

    什么是恶意流量穿透 假设我们的Redis里存有一组用户的注册email,以email作为Key存在,同时它对应着DB里的User表的部分字段。...

  • 24
    • learnblockchain.cn 4 years ago
    • Cache

    详解布隆过滤器 (Bloom Filter) 算法

    布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用...

  • 25

    Zuul 过滤器 zuul 有四种过滤器类型,分别是: 1、Pre:过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等; 2、Routing:过滤器将请求路由到微服务...

  • 32

    过滤器 过滤器简介 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术。如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 S...

  • 17
    • 微信 mp.weixin.qq.com 3 years ago
    • Cache

    布隆过滤器 (Bloom Filter) 详解

    布隆过滤器是由 Burton Bloom 在 1970 年提出,因此也称为 Bloom Filter。 作用 判断一个元素是否在一个集合 实现 通过一个很长的二进制向量和一系...

  • 14
    • my.oschina.net 2 years ago
    • Cache

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

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

  • 2

    springBoot 过滤器去除请求参数前后空格(附源码) 背景 : 用户在前端页面中不小心输入的前后空格,为了防止因为前后空...

  • 3
    • blog.51cto.com 6 months ago
    • Cache

    Redis-布隆过滤器解决穿透详解

    Redis-布隆过滤器解决穿透详解 精选 原创 Redis为普通安装的配置方式Redis为Doc...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK