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

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

相关推荐
盐焗鹌鹑蛋14 小时前
【Linux】线程概念和控制
java·linux·服务器
CarIise15 小时前
MyBatis缓存与分页插件:从一级二级缓存到底层原理与PageHelper实战
java·开发语言·spring
宸津-代码粉碎机21 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
chenbingjie_c1 天前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
噢,我明白了1 天前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅1 天前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
考虑考虑1 天前
synchronized字符串常量
java·后端·java ee
长谷深风1111 天前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383001 天前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析