【发布时间】: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