过滤器和拦截器

在Spring Boot框架中,过滤器(Filter)和拦截器(Interceptor)仍然存在,并且使用方式上有一些区别。以下是针对Spring Boot框架的过滤器和拦截器的一些特点:

过滤器(Filter)

  1. 注册方式: 在Spring Boot中,过滤器的注册可以通过FilterRegistrationBean来完成。通过创建FilterRegistrationBean实例,设置过滤器并添加到FilterRegistrationBean中,然后将FilterRegistrationBean注册到Spring容器。

    typescript 复制代码
    @Bean
    public FilterRegistrationBean<MyFilter> myFilter() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/api/*");
        return registrationBean;
    }
  2. 生命周期: 过滤器的生命周期由Servlet容器管理,与原生Servlet过滤器一致。

拦截器(Interceptor)

  1. 注册方式: Spring Boot中的拦截器通过实现HandlerInterceptor接口,并通过WebMvcConfigureraddInterceptors方法进行注册。

    typescript 复制代码
    @Configuration
    public class MyWebMvcConfigurer implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterceptor())
                    .addPathPatterns("/api/**")
                    .excludePathPatterns("/public/**"); // 可以配置排除拦截的路径
        }
    }
  2. 生命周期: 拦截器的生命周期由Spring容器管理,而且更为灵活,可以通过依赖注入等方式进行更复杂的操作。

共同点

  1. 链式执行: 过滤器和拦截器在Spring Boot中都可以配置为链式执行,一个请求可以通过多个过滤器或拦截器的处理。
  2. 处理顺序: 都可以指定处理顺序,即确定它们在链中的执行顺序。

不同点

  1. 注册方式: 过滤器通过FilterRegistrationBean注册,而拦截器通过实现HandlerInterceptor接口并通过WebMvcConfigurer注册。
  2. 生命周期: 过滤器的生命周期由Servlet容器管理,而拦截器的生命周期由Spring容器管理,更为灵活。
  3. 作用范围: 过滤器对所有请求起作用,而拦截器只作用于Spring MVC的请求处理阶段。
  4. 主要用途: 过滤器主要用于修改请求和响应、过滤敏感信息等,而拦截器主要用于AOP切面编程、权限校验、日志记录等。

顺序呢?

在Spring Boot中,过滤器(Filter)和拦截器(Interceptor)的执行顺序是不同的,这是因为它们分别作用在不同的层次。

过滤器(Filter)

过滤器的执行顺序是由Servlet容器(如Tomcat)决定的,通常按照过滤器在web.xml中的配置顺序执行。具体顺序是由过滤器在FilterRegistrationBean中的注册顺序决定,该顺序可以通过setOrder方法指定。

typescript 复制代码
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
    FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new MyFilter());
    registrationBean.addUrlPatterns("/api/*");
    registrationBean.setOrder(1); // 设置过滤器执行顺序
    return registrationBean;
}

拦截器(Interceptor)

拦截器的执行顺序由注册时的顺序决定。在WebMvcConfigureraddInterceptors方法中,通过registry.addInterceptor()的顺序来指定拦截器的执行顺序。

typescript 复制代码
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/api/**")
                .order(1); // 设置拦截器执行顺序
    }
}

需要注意的是,拦截器的order方法和过滤器的setOrder方法都是设置执行顺序,值越小越先执行。

执行顺序总结

  1. 过滤器的执行顺序由Servlet容器管理,通过web.xml配置或FilterRegistrationBean中的setOrder方法指定。
  2. 拦截器的执行顺序由注册时的顺序决定,通过WebMvcConfigureraddInterceptors方法中的order方法指定。

先后顺序呢?

在Spring Boot中,过滤器(Filter)和拦截器(Interceptor)的执行顺序取决于它们在应用中的注册顺序。一般情况下,过滤器的执行顺序在拦截器之前。

具体来说:

  1. 过滤器(Filter)的执行顺序

    • 过滤器的执行顺序由Servlet容器管理,一般按照在web.xmlFilterRegistrationBean中的配置顺序执行。
    • 通过setOrder方法设置过滤器执行顺序,值越小越先执行。
  2. 拦截器(Interceptor)的执行顺序

    • 拦截器的执行顺序由在WebMvcConfigureraddInterceptors方法中的注册顺序决定。
    • 通过order方法设置拦截器执行顺序,值越小越先执行。

一般情况下,过滤器的执行顺序在拦截器之前,因为过滤器是基于Servlet规范的,而拦截器是Spring MVC框架自身的一部分。在一个请求到达Spring MVC前,会先经过过滤器链,然后才是拦截器链。

在通常的情况下,过滤器在拦截器之前执行。过滤器是Servlet规范中定义的,它在请求进入Servlet容器之前执行,而拦截器是Spring MVC框架中定义的,它在请求进入Spring MVC的DispatcherServlet之前执行。

所以执行顺序通常是:

  1. 过滤器(Filter) :在请求进入Servlet容器之前执行。
  2. 拦截器(Interceptor) :在请求进入Spring MVC的DispatcherServlet之前执行。

在请求返回给客户端时,执行顺序是:

  1. 拦截器(Interceptor) :在DispatcherServlet将响应返回给客户端时执行。
  2. 过滤器(Filter) :在响应返回给客户端时执行。
相关推荐
短剑重铸之日1 小时前
《SpringCloud实用版》 Seata 分布式事务实战:AT / TCC / Saga /XA
后端·spring·spring cloud·seata·分布式事务
FAFU_kyp1 小时前
RISC0_ZERO项目在macOs上生成链上证明避坑
开发语言·后端·学习·macos·rust
qq_12498707531 小时前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计
女王大人万岁2 小时前
Go语言time库核心用法与实战避坑
服务器·开发语言·后端·golang
J_liaty2 小时前
Spring Boot + MinIO 文件上传工具类
java·spring boot·后端·minio
短剑重铸之日2 小时前
《SpringCloud实用版》Stream + RocketMQ 实现可靠消息 & 事务消息
后端·rocketmq·springcloud·消息中间件·事务消息
没有bug.的程序员2 小时前
Spring Boot 事务管理:@Transactional 失效场景、底层内幕与分布式补偿实战终极指南
java·spring boot·分布式·后端·transactional·失效场景·底层内幕
LuminescenceJ3 小时前
GoEdge 开源CDN 架构设计与工作原理分析
分布式·后端·网络协议·网络安全·rpc·开源·信息与通信
Tony Bai3 小时前
【分布式系统】11 理论的试金石:用 Go 从零实现一个迷你 Raft 共识
开发语言·后端·golang
短剑重铸之日3 小时前
《SpringCloud实用版》统一认证授权:Spring Authorization Server + OAuth2 + JWT 生产级方案
java·后端·spring·jwt·oauth2