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

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

相关推荐
kkeeper~3 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行3 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker3 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
盲敲代码的阿豪3 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
你的保护色3 小时前
【无标题】
java·服务器·网络
basketball6164 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报4 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080164 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
淘矿人4 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
想唱rap4 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++