【问题标题】:Exclude Spring Request HandlerInterceptor by Path-Pattern通过 Path-Pattern 排除 Spring Request HandlerInterceptor
【发布时间】:2016-01-23 23:21:54
【问题描述】:

我知道我们可以将不同的 url 映射到不同的拦截器,或者我们也可以将多个 url 映射到单个拦截器。我只是想知道我们是否也有排除选项。例如,如果我在应用程序中有 50 个 url 映射,并且除了 1 个映射之外,我想为所有人调用拦截器,而不是为 49 个映射编写配置,我可以只提 * 和一个排除到第 50 个 url 吗?

【问题讨论】:

    标签: spring interceptor


    【解决方案1】:

    HandlerInterceptors 可以应用于或排除(多个)特定的 url 或 url 模式。

    请参阅MVC Interceptor Configuration

    以下是文档中的示例

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LocaleInterceptor());
            registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
    
            // multiple urls (same is possible for `exludePathPatterns`)
            registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*", "/admin/**", "/profile/**");
        }
    }
    

    或使用 XML 配置

    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/admin/**"/>
            <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <!-- intercept multiple urls -->
            <mvc:mapping path="/secure/*"/>
            <mvc:mapping path="/admin/**"/>
            <mvc:mapping path="/profile/**"/>
            <bean class="org.example.SecurityInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    

    【讨论】:

    • 为什么大家总是只发例子?我有多个需要排除的映射,这个示例对我没有任何作用。
    • 好点。你甚至看过模式/方法签名吗?无论如何。更新了答案。
    【解决方案2】:

    就我而言:

    /api/v1/user-manager-service/tenants/add

    PathPattern 配置不正确:

     @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new RequestInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns("/tenants/**");
        }
    

    我不见了:

    /**

    在实际路径之前。

    修正后按预期工作:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RequestInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/**/tenants/**");
    }
    

    【讨论】:

      【解决方案3】:

      我认为在 spring-boot 2.0 版本中,这已经改变了很多。以下是您可以轻松添加和配置路径模式的实现。

      @Component
      public class ServiceRequestAppConfig implements WebMvcConfigurer {
      
          @Autowired
          ServiceRequestInterceptor sri;
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              String pathPattern = "/admin/**";
              registry.addInterceptor(sri).excludePathPatterns(pathPattern);
          }
      
      }
      
      
      @Component
      public class ServiceRequestInterceptor extends HandlerInterceptorAdapter {
      
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
              // Your logic
              return true;
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex){
               // Some useful techniques
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2013-12-13
        • 2012-03-30
        • 2014-12-09
        • 2020-06-28
        • 1970-01-01
        相关资源
        最近更新 更多