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最先执行,postHandleafterCompletion最后执行

  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,避免不可预期的行为

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

相关推荐
少控科技7 小时前
QT第6个程序 - 网页内容摘取
开发语言·qt
darkb1rd7 小时前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
南极企鹅7 小时前
springBoot项目有几个端口
java·spring boot·后端
历程里程碑7 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴7 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
清风拂山岗 明月照大江7 小时前
Redis笔记汇总
java·redis·缓存
承渊政道7 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
xiaoxue..7 小时前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
JQLvopkk7 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
忧郁的Mr.Li8 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端