• WebMvcConfigurer添加多个拦截器的拦截路径问题


    结论:每个拦截器的addPathPatterns,excludePathPatterns添加的路径是各自独立的,如果添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求,如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。

    验证过程:

    两个拦截器:

    public class TestInterceptor1 implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            response.getOutputStream().write("To TestInterceptor1...".getBytes());
    
            return true;
        }
    }
    
    public class TestInterceptor2 implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            response.getOutputStream().write("To TestInterceptor2...".getBytes());
    
            return true;
        }
    }

    情景一:两个拦截器的拦截路径不同

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry interceptorRegistry){
            interceptorRegistry.addInterceptor(new TestInterceptor1()).addPathPatterns("/ready");
            interceptorRegistry.addInterceptor(new TestInterceptor2()).addPathPatterns("/health");
        }
    }

    -------------测试结果-------------

     

    情景二 :其中一个拦截器不配置拦截路径

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry interceptorRegistry){
            interceptorRegistry.addInterceptor(new TestInterceptor1()).addPathPatterns("/ready");
            interceptorRegistry.addInterceptor(new TestInterceptor2());
        }
    }

    -------------测试结果-------------

     

    情景三:

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry interceptorRegistry){
            interceptorRegistry.addInterceptor(new TestInterceptor1());
            interceptorRegistry.addInterceptor(new TestInterceptor2()).addPathPatterns("/health");
        }
    }

    -------------测试结果-------------

     

     情景四:其中一个拦截器的拦截路径在另一个拦截器的不拦截路径内

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry interceptorRegistry){
            interceptorRegistry.addInterceptor(new TestInterceptor1()).addPathPatterns("/ready");
            interceptorRegistry.addInterceptor(new TestInterceptor2()).excludePathPatterns("/ready");
        }
    }

    -------------测试结果-------------

     

     

    从源码上看每个拦截器interceptor的includePatterns和excludePatterns也确实是独立的,可以参考下

    public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
       InterceptorRegistration registration = new InterceptorRegistration(interceptor);
       this.registrations.add(registration);
       return registration;
    }
    
    public InterceptorRegistration addPathPatterns(List<String> patterns) {
       this.includePatterns.addAll(patterns);
       return this;
    }
    
    public InterceptorRegistration excludePathPatterns(List<String> patterns) {
       this.excludePatterns.addAll(patterns);
       return this;
    }
  • 相关阅读:
    1007 素数对猜想 (20 分)
    1005 继续(3n+1)猜想 (25 分)
    1002 写出这个数 (20 分)
    1001 害死人不偿命的(3n+1)猜想 (15 分)
    mysql常用操作
    mysql乱码问题
    mysql忘记root密码
    linux开机启动
    fedora 调整屏幕亮度
    Access denied for user 'root'@'localhost' (using password:YES) 解决方案
  • 原文地址:https://www.cnblogs.com/aland-1415/p/14343975.html
Copyright © 2020-2023  润新知