SpringBoot中WebMvcConfigurer注册多个拦截器(addInterceptors)时的顺序问题(一)

在Spring Boot中,你可以通过多次调用registry.addInterceptor()来注册多个拦截器,并通过order()方法或添加顺序来控制它们的执行顺序。以下是具体实现方式:

1. 注册多个拦截器并控制顺序

复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private VideoInterceptor videoInterceptor;
    
    @Autowired
    private AnotherInterceptor anotherInterceptor;
    
    @Autowired
    private LoggingInterceptor loggingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 第一个拦截器(最后执行)
        registry.addInterceptor(loggingInterceptor)
                .addPathPatterns("/**")
                .order(3);  // 数字越大,优先级越低
        
        // 第二个拦截器
        registry.addInterceptor(anotherInterceptor)
                .addPathPatterns("/api/**")
                .order(2);
        
        // 第三个拦截器(最先执行)
        registry.addInterceptor(videoInterceptor)
                .addPathPatterns("/video/**")
                .order(1);  // 数字越小,优先级越高
    }
}

2. 关于执行顺序的关键点

  1. order值决定顺序:

    • order()值越小,拦截器越先执行

    • 类似Filter的链式调用,但顺序与Filter相反

  2. 执行流程:

    • 请求进入时:order小的先执行

    • 响应返回时:order小的后执行

    • 比如order(1)的拦截器:preHandle最先执行,postHandle和afterCompletion最后执行

  3. 如果不指定order:

    • 默认按添加顺序执行(最后添加的优先级最低)

    • 但显式指定order是更可靠的做法

3. 实际应用示例

假设你需要:

  1. 先验证权限(order=1)

  2. 然后记录日志(order=2)

  3. 最后处理视频请求(order=3)

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    // 1. 权限验证(最先执行)
    registry.addInterceptor(authInterceptor)
    .addPathPatterns("/")
    .excludePathPatterns("/public/
    ")
    .order(1);

    复制代码
     // 2. 日志记录
     registry.addInterceptor(loggingInterceptor)
             .addPathPatterns("/**")
             .order(2);
    
     // 3. 视频处理(最后执行)
     registry.addInterceptor(videoRequestInterceptor)
             .addPathPatterns("/hls/**")
             .order(3);

    }

4. 注意事项

  • 如果多个拦截器拦截同一路径,order小的会先执行

  • 某个拦截器的preHandle返回false时,后续拦截器和控制器都不会执行

  • 推荐为每个拦截器明确指定order,避免不可预期的行为

通过这种方式,你可以灵活控制多个拦截器的执行顺序和拦截范围。

相关推荐
Shaoshing14 分钟前
消息顺序
java·开发语言
星辰云-18 分钟前
# 基于Spring Boot的德州特产扒鸡商城系统(毕设|源码|论文|演示视频)
spring boot·后端·课程设计
云水初24 分钟前
【项目篇】基于LanGraph的自动处理客服邮件的 Agent汇总
开发语言·笔记·python·学习·fastapi·langgraph
茉莉玫瑰花茶25 分钟前
GO [ 内存与变量逃逸分析 ]
开发语言·后端·golang
星辰云-28 分钟前
基于Spring Boot的旅游景点票务系统的设计与实现(毕设项目,附完整源码)
spring boot·后端·课程设计
我命由我1234538 分钟前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
lhh_qrsly1 小时前
OTA 加密完整方案(嵌入式 IoT 常用)
开发语言·物联网·php
Nontee1 小时前
Quartz 新手入门:定时任务的两个承诺
开发语言·windows·python
Hpc_Fun1 小时前
GPU 工作站品牌怎么比?五把可核验尺子、加权评分脚本与场景重排
java·信创·gpu工作站·品牌对比·加权评分
const_qiu1 小时前
第四章 03:4.3 Tools —— 让 Agent 会用工具
java·人工智能