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)方法指定顺序,值越小优先级越高