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;
}

 

posted @ 2021-05-08 09:38  覆手为云p  阅读(6775)  评论(0编辑  收藏  举报
停止精灵球