Spring Boot 如何配置过滤器,一波梭哈~

简介: Spring Boot 如何配置过滤器,一波梭哈~

目录

  • 前言
  • Spring Boot 版本
  • 什么是过滤器?
  • Filter的执行原理
  • 如何自定义一个Filter?
  • Spring Boot如何配置Filter?
  • 配置类中使用@Bean注入【推荐使用】
  • 使用@WebFilter
  • 举个栗子
  • 总结

前言

上篇文章介绍了Spring Boot中如何配置拦截器,今天这篇文章就来讲讲类似于拦截器的一个组件:过滤器。

其实在实际开发中过滤器真的接触的不多,但是在应用中却是不可或缺的角色,值得花费一个章节专门介绍一下。

Spring Boot 版本

本文基于的Spring Boot的版本是2.3.4.RELEASE

什么是过滤器?

Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如JSP,Servlet,静态图片文件或静态HTML文件进行拦截,从而实现一些特殊功能。例如实现URL级别的权限控制过滤敏感词汇压缩响应信息等一些高级功能。

Filter的执行原理

当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务,如下图:

服务器会按照过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。(注:这一点FilterServlet是不一样的)执行的顺序就如下图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。

如何自定义一个Filter?

这个问题其实不是Spring Boot这个章节应该介绍的了,在Spring MVC中就应该会的内容,只需要实现javax.servlet.Filter这个接口,重写其中的方法。实例如下:

@Component
public class CrosFilter implements Filter {
    //重写其中的doFilter方法
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        //继续执行下一个过滤器
        chain.doFilter(req, response);
    }

Spring Boot如何配置Filter?

自定义好了过滤器当然要使其在Spring Boot中生效了,Spring Boot配置Filter有两种方式,其实都很简单,下面一一介绍。

配置类中使用@Bean注入【推荐使用】

其实很简单,只需要将FilterRegistrationBean这个实例注入到IOC容器中即可,如下:

@Configuration
public class FilterConfig {
    @Autowired
    private Filter1 filter1;
    @Autowired
    private Filter2 filter2;
    /**
     * 注入Filter1
     * @return
     */
    @Bean
    public FilterRegistrationBean filter1() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter1);
        registration.addUrlPatterns("/*");
        registration.setName("filter1");
        //设置优先级别
        registration.setOrder(1);
        return registration;
    }
    /**
     * 注入Filter2
     * @return
     */
    @Bean
    public FilterRegistrationBean filter2() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter2);
        registration.addUrlPatterns("/*");
        registration.setName("filter2");
        //设置优先级别
        registration.setOrder(2);
        return registration;
    }
}

注意:设置的优先级别决定了过滤器的执行顺序。

使用@WebFilter

@WebFilter是Servlet3.0的一个注解,用于标注一个Filter,Spring Boot也是支持这种方式,只需要在自定义的Filter上标注该注解即可,如下:

@WebFilter(filterName = "crosFilter",urlPatterns = {"/*"})
public class CrosFilter implements Filter {
    //重写其中的doFilter方法
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        //继续执行下一个过滤器
        chain.doFilter(req, response);
    }
}

要想@WebFilter注解生效,需要在配置类上标注另外一个注解@ServletComponentScan用于扫描使其生效,如下:

@SpringBootApplication
@ServletComponentScan(value = {"com.example.springbootintercept.filter"})
public class SpringbootApplication {}

至此,配置就完成了,启动项目,即可正常运行。

举个栗子

对于前后端分离的项目来说跨域是一个难题,什么是跨域问题?如何造成的?这个不是本章的重点。

对于跨域问题有多中解决方案,比如JSONP,网关支持等等。关于跨域的问题以及Spring Boot如何优雅的解决跨域问题?将会在后续文章中介绍。今天主要介绍如何使用过滤器来解决跨域问题。

其实原理很简单,只需要在请求头中添加相应支持跨域的内容即可,如下代码仅仅是简单的演示下,针对细致的内容还需自己完善,比如白名单等等。

@Component
public class CrosFilter implements Filter {
    //重写其中的doFilter方法
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers"," Origin, X-Requested-With, Content-Type, Accept");
        //继续执行下一个过滤器
        chain.doFilter(req, response);
    }
}

配置类中注入FilterRegistrationBean,如下代码:

@Configuration
public class FilterConfig {
    @Autowired
    private CrosFilter crosFilter;
    /**
     * 注入crosFilter
     * @return
     */
    @Bean
    public FilterRegistrationBean crosFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(crosFilter);
        registration.addUrlPatterns("/*");
        registration.setName("crosFilter");
        //设置优先级别
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registration;
    }
}

至此,配置完成,相关细致功能还需自己润色。

总结

过滤器内容相对简单些,但是在实际开发中不可或缺,比如常用的权限控制框架ShiroSpring Security,内部都是使用过滤器,了解一下对以后的深入学习有着固本的作用。

相关文章
|
23天前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
140 0
|
5天前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
|
22天前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
4天前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
22天前
|
监控 NoSQL Java
Spring Boot Actuator 使用和常用配置
Spring Boot Actuator 使用和常用配置
36 5
|
23天前
|
Java Spring
spring boot 中默认最大线程连接数,线程池数配置查看
spring boot 中默认最大线程连接数,线程池数配置查看
45 4
|
22天前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
41 3
|
23天前
|
XML JSON Java
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
129 1
|
8天前
|
Java Spring
Spring Boot Admin 授权配置
Spring Boot Admin 授权配置
16 0
|
8天前
|
监控 Java Spring
Spring Boot Admin 配置应用
Spring Boot Admin 配置应用
18 0