SptingBoot过滤器Filter的使用详解

 更新时间:2023年09月25日 10:08:42   作者:骑个小蜗牛  
这篇文章主要介绍了SptingBoot过滤器Filter的使用详解,Filter属于Servlet规范,并不是Spring独有的,Filter主要用于拦截请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servlet,需要的朋友可以参考下

Filter

Filter属于Servlet规范,并不是Spring独有的。Filter主要用于拦截请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servlet。

Filter的工作流程

  1. 进入filter,执行相关业务逻辑
  2. 若判定失败,直接返回,不需要将请求发给Servlet
  3. 若判定通行,进行入下一个filter
  4. 如果全部filter通行,进入Servlet逻辑,Servlet执行完毕之后,又返回Filter,最后在返回给请求方

自定义Filter的使用方式

Spring中过滤器Filter不同使用方式都是通过:FilterRegistrationBean包装filter,最终注册到Servlet容器中。

1. @WebFilter+@ServletComponentScan

在SpringBootApplication上添加@ServletComponentScan注解,在Filter上添加@WebFilter注解。

该方式的缺点:无法设置过滤器之间的优先级。

@WebFilter+@ServletComponentScan方式无法通过@Order注解指定过滤器优先级:优先级使用默认值Ordered.LOWEST_PRECEDENCE(2147483647),相同优先级的情况下,根据名字先后顺序来决定。

使用方法

1. 在SpringBootApplication上使用@ServletComponentScan注解

@ServletComponentScan
@SpringBootApplication
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

2.在Filter上使用@WebFilter注解

@WebFilter(urlPatterns = {"/test3"})
public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("======= MyFilter =======");
        filterChain.doFilter(request,response);
    }
}

@WebFilter

@WebFilter用于将一个类声明为过滤器。

WebFilter注解的主要属性:

属性名类型描述
filterNameString指定过滤器的name属性,(springbean也是用该名称),等价于< filter-name>
urlPatternsString[]指定一组过滤器的URL匹配模式。等价于< url-pattern>
valueString[]该属性等价于urlPatterns属性,但是两个不应该同时使用
sevletNamesString[]指定过滤器将用于哪些servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中< servlet-name>
dispatcherTypesDispatcherType[]指定一组过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST,默认REQUEST
initParamsWebInitParam[]指定一组过滤器初始化参数,等价于< init-param>
asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于< async-supported>标签
descriptionString过滤器的描述信息,等价于< description>
displayNameString过滤器的显示名,通常配合工具使用,等价于< display-name>

在SpringBoot项目中,@WebServlet、@WebFilter、@WebListener这三个注解默认是不会被扫描的,一般在SpringBootApplication上添加@ServletComponentScan注解,表示对这三个注解的扫描。

@ServletComponentScan可以实现將Servlet(控制器)、Filter(过滤器)、Listener(监听器)自动注册到Spring容器中,无需其他代码。

  • Servlet:通过@WebServlet注解定义
  • Filter:通过@WebFilter注解定义
  • Listener:通过@WebListener注解定义

常见问题分析

1. 只使用@WebFilte:过滤器不生效

WebFilter属于注解属于Servlet3+,与Spring本身没有什么关系,所以Spring默认是不认识这个注解的。

2. @WebFilter+@Component:配置的过滤条件不生效 同上,Spring是不认识@WebFilter注解的,所以注解配置的任何属性都无意义(例如:指定过滤的url)。 该种方式其实就等同于只加了个@Component注解,此时过滤器能生效,但无过滤条件,会过滤所有url。

3. @WebFilter+@Component+@ServletComponentScan:过滤器会被调用两次

  • 一次:@WebFilter+@ServletComponentScan,被SpringBean管理,过滤器生效,根据@WebFilter配置的属性过滤
  • 二次:@Component,又被SpringBean管理一次,过滤器生效(和上面不是同一个bean),过滤全部url

4. @WebFilter+@Order+@ServletComponentScan:设置过滤器优先级无效

通过@WebFilter+@ServletComponentScan方式注册的,其生成的FilterRegistrationBean并没有检查@Order注解,所以@Order注解不生效。

2. @Component+@Order

通过在Filter上加@Component和@Order注解,即可被Spring管理,并可指定过滤器的执行顺序。

该方式的缺点:只能过滤所有URL,不能通过配置去过滤指定的 URL。

使用方法

@Order(100)
@Component
public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("======= MyFilter =======");
        filterChain.doFilter(request,response);
    }
}

3. FilterRegistrationBean(推荐)

直接通过配置类定义Filter的FilterRegistrationBean,交给SpringBean容器管理。

该方式既能通过配置去过滤指定的 URL,也能指定过滤器之间的优先级。

使用方法

public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("======= MyFilter =======");
        filterChain.doFilter(request,response);
    }
}
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<MyFilter> filterRegistrationBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(myFilter());
        registration.setName("myFilter");
        registration.addUrlPatterns("/test3");
        registration.setOrder(100);
        return registration;
    }
    @Bean
    public MyFilter myFilter() {
        return new MyFilter();
    }
}

到此这篇关于SptingBoot过滤器Filter的使用详解的文章就介绍到这了,更多相关SptingBoot过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA自动生成类图和时序图的操作指南

    IDEA自动生成类图和时序图的操作指南

    idea 的强大之处在于此,它包含了很多小插件,我们不需要再次下载相关插件,只需要在idea中小小的设置一下就可以了,本文我介绍了IDEA自动生成类图和时序图的操作指南,我用的是idea2020版本,需要的朋友可以参考下
    2024-05-05
  • Spring Boot 项目与JDK、Mybatis版本兼容对应关系表及问题记录

    Spring Boot 项目与JDK、Mybatis版本兼容对应关系表及问题记录

    本文总结SpringBoot与JDK、MyBatis、SpringCloud及SpringCloudAlibaba的版本兼容性,提供对应关系表和注意事项,建议使用SpringBoot的依赖管理,匹配官方推荐版本,避免冲突,确保稳定性,感兴趣的朋友跟随小编一起看看吧
    2025-07-07
  • Java多线程中断机制三种方法及示例

    Java多线程中断机制三种方法及示例

    这篇文章主要介绍了Java多线程中断机制三种方法及示例,向大家分享了这三种方法的介绍几代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java Web过滤器的核心原理、实现与执行顺序配置方法(最新整理)

    Java Web过滤器的核心原理、实现与执行顺序配置方法(最新整理)

    本文介绍了JavaWeb过滤器的核心概念、实现方式及执行顺序,过滤器允许在请求到达Servlet之前或响应返回客户端之前对请求和响应进行处理,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 话说Spring Security权限管理(源码详解)

    话说Spring Security权限管理(源码详解)

    本篇文章主要介绍了话说Spring Security权限管理(源码详解) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringBoot集成WebSokcet代码步骤

    SpringBoot集成WebSokcet代码步骤

    Spring Boot是一个流行的Java框架,用于快速构建Spring应用程序,WebSocket是一种实现实时通信的协议,与HTTP协议结合使用,可以提供全双工通信,这篇文章主要介绍了SpringBoot集成WebSokcet代码步骤
    2026-01-01
  • java对于JSON的解析方法举例详解

    java对于JSON的解析方法举例详解

    在编写应用时,我们经常要解析JSON,下面这篇文章主要给大家介绍了关于java对于JSON的解析方法,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 8张图带你全面了解Java kafka的核心机制

    8张图带你全面了解Java kafka的核心机制

    kafka是目前企业中很常用的消息队列产品,可以用于削峰、解耦、异步通信,本文就通过几张图带大家全面认识一下kafka,现在我们不妨带入kafka设计者的角度去思考该如何设计,它的架构是怎么样的、都有哪些组件组成、如何进行扩展等等,需要的朋友可以参考下
    2023-05-05
  • 反对使用Spring封装的多线程类原因

    反对使用Spring封装的多线程类原因

    这篇文章主要介绍了反对使用Spring封装的多线程类原因,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Spring Boot小型项目如何使用异步任务管理器实现不同业务间的解耦

    Spring Boot小型项目如何使用异步任务管理器实现不同业务间的解耦

    这篇文章主要介绍了Spring Boot小型项目如何使用异步任务管理器实现不同业务间的解耦,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论