Spring启动筛选器模式匹配错误的URL
我正在开发一个SpringBootWeb应用程序。它包含以下配置类: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请求、最终
@配置
公共类筛选器注册{
@豆子
公共过滤器注册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。