如何让多个Spring HandlerInterceptor按照指定顺序执行
问题根因
通过WebMvcConfigurer的addInterceptors()方法注册拦截器时,拦截器类上标注的@Order注解不会被Spring读取生效,只有注册时通过InterceptorRegistration的order()方法显式指定的优先级才会生效:
- order值越小,拦截器优先级越高,
preHandle方法越先执行 - 未显式指定order的拦截器,默认优先级为
0
解决方案
修改业务项目的拦截器注册逻辑,显式给自定义拦截器设置更低的优先级(更大的order值),即可保证它在库拦截器之后执行:
@SpringBootApplication public class ActualProjectConfig implements WebMvcConfigurer { @Autowired private ActualProjectInterceptor actualProjectInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(actualProjectInterceptor) // 显式设置为最低优先级,保证晚于库拦截器执行 .order(Ordered.LOWEST_PRECEDENCE); } }
如果修改后还是不生效,说明库的拦截器注册时也设置了低优先级,你只需要调整自定义拦截器的order值,保证它比库拦截器的order值大即可,比如库拦截器order为10,你设置为11即可。
额外注意项
你依赖的库配置类上加了@EnableWebMvc注解,该注解会覆盖Spring Boot的MVC自动配置,如果后续遇到静态资源无法访问、内置消息转换器失效等问题,优先排查该注解的影响,如果可以修改库代码,建议去掉库配置类上的@EnableWebMvc,如果无法修改库代码,在业务项目中手动补全需要的MVC配置即可。
内容的提问来源于stack exchange,提问作者justAnotherDev
相关产品推荐
相关产品推荐

