【问题标题】:Spring Boot filter pattern matches wrong urlsSpring Boot 过滤器模式匹配错误的 url
【发布时间】:2016-08-24 23:02:11
【问题描述】:

我正在开发一个 Spring Boot Web 应用程序。它包含以下配置类:

@Configuration
public class FilterRegistration {

    @Bean
    public FilterRegistrationBean provideTestFilter() {
        final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException {
                throw new RuntimeException("I shouldn't be thrown!");
            }
        });
        registrationBean.addUrlPatterns("/users/*");
        return registrationBean;
    }

}

我可以看出过滤器已成功注册,因为在启动期间,控制台会记录以下条目:

o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'oncePerRequestFilter' to urls: [/users/*]

当我测试端点时,我得到以下结果:

curl localhost:8080/users/bob -> {"status": 500, "message": "I shouldn't be thrown!"}

curl localhost:8080/users/ -> {"status": 500, "message": "I shouldn't be thrown!"}

curl localhost:8080/users -> {"status": 500, "message": "I shouldn't be thrown!"}

curl localhost:8080/usersx -> {"status": 404, "error": "Not Found"}

第一个和最后一个结果是预期的,但为什么 url 模式 /users/* 也匹配 url /users//users

Spring url 模式是否有不同的语法来 _not_ 匹配这两个 url,并且只匹配 /users/bob/users/alice/users/any_non_empty_string

【问题讨论】:

  • 您可以在过滤器逻辑周围添加if (request.getRequestURI().matches("/users/.*"))..
  • @AliDehghani 我明白了,但我不想让我的过滤器知道它将应用到的 url。

标签: spring spring-mvc filter spring-boot servlet-filters


【解决方案1】:

过滤器模式的行为完全符合 Servlet 规范。该规范描述了 Servlet 方面的映射,但同样的规则也适用于过滤器。它提供了以下示例映射:

  • /foo/bar/* 映射到 servlet1
  • /baz/* 映射到 servlet2
  • /catalog 映射到 servlet3
  • *.bop 映射到 servlet4

鉴于这些映射,将产生以下行为:

  • /foo/bar/index.htmlservlet1 处理
  • /foo/bar/index.bopservlet1 处理
  • /bazservlet2 处理
  • /baz/index.htmlservlet2 处理
  • /catalogservlet3 处理
  • /catalog/index.htmldefault servlet 处理
  • /catalog/racecar.bopservlet4 处理
  • /index.bopservlet4 处理

您描述的情况与/baz的请求相同,该请求由映射到/baz/*servlet2处理。

Spring url 模式是否有不同的语法匹配这两个 url,只匹配 /users/bob、/users/alice 或 /users/any_non_empty_string?

如上面的示例所示,Servlet 规范不提供对此类映射的支持。您需要添加一些逻辑来处理这种情况。您可以直接在过滤器中执行此操作,也可以在另一个首先运行并设置请求属性告诉另一个过滤器忽略请求的过滤器中执行此操作。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 2021-10-29
    • 1970-01-01
    • 2016-10-02
    • 2017-02-04
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多