往期精彩推荐
SpringBoot系列(一)idea新建Springboot项目SpringBoot系列(二)入门知识
springBoot系列(三)配置文件详解
SpringBoot系列(四)web静态资源配置详解
SpringBoot系列(五)Mybatis整合完整详细版
SpringBoot系列(六)集成thymeleaf详解版
Springboot系列(七) 集成接口文档swagger,使用,测试
SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式
SpringBoot系列(九)单,多文件上传的正确姿势
SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?
目录
Filter也称之为过滤器,过滤器是对数据进行过滤,预处理。开发人员可以对客户端提交的数据进行过滤处理,比如敏感词,也可以对服务端返回的数据进行处理。还有就是可以验证用户的登录情况,权限验证,对静态资源进行访问控制,没有登录或者是没有权限时是不能让用户直接访问这些资源的。类似的过滤器还有很多的功能,比如说编码,压缩服务端给客户端返回的各种数据,等等。
过滤器这么牛逼,那么它的 运作 原理是什么呢?
java为我们提供了一个 Filter 接口,我们只需要实现这个接口就能实现自定义过滤器,然后添加一些必要的配置让过滤器生效。过滤器只能初始化一次,并且过滤器只会在项目停止或者是重新部署的时候才销毁。我们可以实现的这个Filter接口,里面最重要的是一个 doFilter 方法,当我们编写好Filter,并配置好对那个URL资源进行拦截时,每一次请求这个资源之前就会调用这个doFilter方法。并且在这个doFilter方法里面也有着一个 FilterChain 的对象参数 ,这个对象里面也有一个doFilter方法,是否调用这个方法决定了这个过滤器是否能调用后面的资源或者是执行后面的过滤器。也就是相当于目标资源。所以在过滤器里面可以进行一些什么操作呢?可以在调用目标资源之前,进行权限等的处理;判断是否调用目标资源;也可以在调用目标资源之后进行一些响应消息进行处理。
首先我们定义一个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的基本配置,运行项目即可看到效果,还有一种非注解形式的配置方式。
我们可以通过自己定义一个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; } }
这个配置和上面的注解配置类似。上面注解实现的原理也是这样的,虽然是两种不同的方法,但是是一样的原理。
controller代码编写
@RestController @RequestMapping("/Filter") public class FilterController { @RequestMapping("/testFilter") public String testFilter(){ System.out.println("filter执行成功"); return "filter"; } }
完成之后启动项目,访问接口:localhost:8098/Filter/testFilter,观察控制台运行结果。
根据之前我们说的,过滤器只会执行一次,然后过滤器也只会在项目停止或者是重新部署的时候才会销毁,所以我们是看不到销毁的代码输出出来。
本文先讲解了过滤器的一些概念,用途,然后详细讲解了过滤器的在SpringBoot中的配置与使用,我们介绍了两种配置方法,分别是注解方式与java 代码的配置。之后进行测试,与结果展示。如果你觉得本文对你有用,可以点个关注哦!