Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring启动筛选器模式匹配错误的URL_Spring_Spring Mvc_Filter_Spring Boot_Servlet Filters - Fatal编程技术网

Spring启动筛选器模式匹配错误的URL

Spring启动筛选器模式匹配错误的URL,spring,spring-mvc,filter,spring-boot,servlet-filters,Spring,Spring Mvc,Filter,Spring Boot,Servlet Filters,我正在开发一个SpringBootWeb应用程序。它包含以下配置类: @配置 公共类筛选器注册{ @豆子 公共过滤器注册Bean provideTestFilter(){ final FilterRegistrationBean registrationBean=新FilterRegistrationBean(); setFilter(新的OncePerRequestFilter(){ @凌驾 受保护的void doFilterInternal(最终HttpServletRequest请求、最终

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

@配置
公共类筛选器注册{
@豆子
公共过滤器注册Bean provideTestFilter(){
final FilterRegistrationBean registrationBean=新FilterRegistrationBean();
setFilter(新的OncePerRequestFilter(){
@凌驾
受保护的void doFilterInternal(最终HttpServletRequest请求、最终HttpServletResponse响应、最终FilterChain FilterChain)抛出ServletException、IOException{
抛出新的RuntimeException(“我不应该被抛出!”);
}
});
registrationBean.addUrlPatterns(“/users/*”);
返回注册bean;
}
}
我可以看出筛选器已成功注册,因为在启动期间,控制台会记录以下条目:

o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'oncePerRequestFilter' to urls: [/users/*]
当我测试端点时,我得到以下结果:

curl localhost:8080/users/bob
->
{“状态”:500,“消息”:“我不应该被抛出!”}

curl localhost:8080/users/
->
{“状态”:500,“消息”:“我不应该被抛出!”}

curl localhost:8080/用户
->
{“状态”:500,“消息”:“我不应该被抛出!”}

curl localhost:8080/usersx
->
{“状态”:404,“错误”:“未找到”}

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


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

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

  • /foo/bar/*
    映射到
    servlet1
  • /baz/*
    映射到
    servlet2
  • /catalog
    映射到
    servlet3
  • *.bop
    映射到
    servlet4
考虑到这些映射,将导致以下行为:

  • /foo/bar/index.html
    servlet1处理
  • /foo/bar/index.bop
    servlet1处理
  • /baz
    servlet2处理
  • /baz/index.html
    servlet2处理
  • /catalog
    servlet3处理
  • /catalog/index.html
    默认servlet处理
  • /catalog/racecar.bop
    servlet4处理
  • /index.bop
    servlet4处理
您描述的情况与映射到
/baz/*
servlet2
处理的
/baz
请求相同

SpringURL模式是否有不同的语法来不匹配这两个url,而只匹配/users/bob、/users/alice或/users/any\u非\u空\u字符串


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

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