springboot里给拦截器定义顺序—@Order不生效

最近项目里使用到了多个拦截器,由于业务需要按顺序执行拦截器,各个拦截器处理不同的内容。

拦截器1

public class PathInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("PathInterceptor 执行");
System.out.println("第一个执行的拦截器,进行权限校验。巴拉巴拉、、、、");
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("PathInterceptor afterCompletion 完成");
}
}

拦截器2

public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("TestInterceptor 执行");
System.out.println("第二个执行的拦截器。巴拉巴拉、、、、");
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("TestInterceptor afterCompletion 完成");
}
}

默认情况下,拦截器按照注册的顺序执行:

@Bean
public TestInterceptor testInterceptor() {
return new TestInterceptor();
}
@Bean
public PathInterceptor pathInterceptor() {
return new PathInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor()).addPathPatterns("/**");
registry.addInterceptor(pathInterceptor()).addPathPatterns("/**");
}

输出:

TestInterceptor 执行
第二个执行的拦截器。巴拉巴拉、、、、
PathInterceptor 执行
第一个执行的拦截器,进行权限校验。巴拉巴拉、、、、
PathInterceptor afterCompletion 完成
TestInterceptor afterCompletion 完成

但是一不小心容易写错,又不好发现,比如上面的。
通过面向百度编程发现

  • 可以使用 @Order 注解定义顺序
  • 实现Ordered接口

测试发现都不生效,注解无论放到拦截器类上还是放到@Bean注解的位置都无效

解决方法

注册拦截器时,使用 InterceptorRegistry#order(int) 方法指定顺序,值越小优先级越高。

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor()).addPathPatterns("/**").order(2);
registry.addInterceptor(pathInterceptor()).addPathPatterns("/**").order(1);
}

输出

PathInterceptor 执行
第一个执行的拦截器,进行权限校验。巴拉巴拉、、、、
TestInterceptor 执行
第二个执行的拦截器。巴拉巴拉、、、、
TestInterceptor afterCompletion 完成
PathInterceptor afterCompletion 完成

总结

spring中拦截器执行顺序:
1、默认的注册顺序
2、InterceptorRegistry#order(int)方法指定顺序,值越小优先级越高

posted @   originyuan  阅读(4857)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示