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 @ 2022-05-07 21:40  originyuan  阅读(4736)  评论(1编辑  收藏  举报