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

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

相关推荐
木心爱编程2 分钟前
【Qt 5.14.2 新手实战】QTC++入门筑基——按钮与标签联动:QPushButton + QLabel 实现图片切换器
java·c++·qt
weixin_307779133 分钟前
Jenkins Pipeline 完全指南:核心概念、使用详解与最佳实践
开发语言·ci/cd·自动化·jenkins·etl
kk”6 分钟前
c++红黑树
开发语言·c++
Gomiko7 分钟前
JavaScript DOM 原生部分(二):元素内容修改
开发语言·javascript·ecmascript
Z_W_H_10 分钟前
【C#】C#中值类型和引用类型参数传递的区别
开发语言·c#
Data_agent16 分钟前
实战:用Splash搞定JavaScript密集型网页渲染
开发语言·javascript·ecmascript
leiming618 分钟前
C++ 02 函数模板案例
开发语言·c++·算法
weixin_4215850119 分钟前
PYTHON 迭代器1 - PEP-255
开发语言·python
小新11030 分钟前
vs2022+Qt插件初体验,创建带 UI 界面的 Qt 项目
开发语言·qt·ui
椰羊~王小美34 分钟前
setScale没传roudingmode,为什么会报错
java