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)方法指定顺序,值越小优先级越高
分类:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~