SpringBoot(十二)过滤器详解

往期精彩推荐

SpringBoot系列(一)idea新建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,观察控制台运行结果。

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

4. 总结

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

SpringBoot系列(十二)过滤器配置详解的更多相关文章

  1. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

  2. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  3. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  4. 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...

  5. SpringBoot第十篇:thymeleaf详解

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   Sprin ...

  6. 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解

    今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...

  7. struts2系列(三):struts2配置详解

    原文链接:http://www.cnblogs.com/fmricky/archive/2010/05/20/1740479.html 1.<include> 利用include标签,可以 ...

  8. 从Spring到SpringBoot构建WEB MVC核心配置详解

    目录 理解Spring WEB MVC架构的演变 认识Spring WEB MVC 传统时代的Spring WEB MVC 新时代Spring WEB MVC SpringBoot简化WEB MVC开 ...

  9. Carbondata源码系列(二)文件格式详解

    在上一章当中,写了文件的生成过程.这一章主要讲解文件格式(V3版本)的具体细节. 1.字典文件格式详解 字典文件的作用是在存储的时候将字符串等类型转换为int类型,好处主要有两点: 1.减少存储占用空 ...

随机推荐

  1. 1018 Public Bike Management (30 分)

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  2. Jmeter压力测试笔记(5)问题原因

    压测链路是jmeter=>slb=>nginx => php=>rds 报 Too Many Connections 的原因是前端同时保持了 16000 个连接,达到实例规格的 ...

  3. Python常见数据结构-Dictionary字典

    字典基本特点 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中. 键是唯一的,如果重复最后的一个键值对会替换前面的,值不需 ...

  4. Kitty-Cloud服务搭建过程剖析

    项目地址 https://github.com/yinjihuan/kitty-cloud 服务搭建 大家目前看到的都是我已经搭建好了的服务,如果让你从零开始自己搭建一个微服务的项目,要怎么做? 我们 ...

  5. matplotlib中的基本概念

    有外语基础的朋友看这里: matplotlib官方文档 Figure(图像): 组成部分

  6. centos7 NAT链接配置(静态ip/修改网卡名为eth0)|1

    NAT的静态ip设置并且修改网卡名为eth0 1 cd /etc/sysconfig/network-scripts/ mv eno16777736  ifcfg-eth0 #修改名称 vi eth0 ...

  7. Linq 学习——将List集合作为筛选条件查询数据

    例: A表是一个List集合,B表也是一个List集合 .A与B有一个共同的字段 RecognitionCarCode B表通过RecognitionCarCode去重后拿到两个值{'1','2'}记 ...

  8. 2020年iOS进阶面试题总结(一)

    准备找工作的你,可以看看,复习复习!! 1.说一下OC的反射机制 在动态运行下我们可以构建任何一个类,然后我们通过这个类知道这个类的所有的属性和方法,并且如果我们创建一个对象,我们也可以通过对象找到这 ...

  9. Springboot启动流程简单分析

    springboot启动的类为SpringApplication,执行构造函数初始化属性值后进入run方法: 然后返回ConfigurableApplicationContext(spring应用). ...

  10. 【python实现卷积神经网络】池化层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...