Spring MVC 路径匹配忽略双斜杠 //

Spring MVC Path matching ignoring double slash //

在 Spring 引导应用程序中,我设置了一个过滤器 url 映射 /service1/*。这是使用 FilterRegistrationBean.

完成的

还有一个映射到相同模式的控制器:

   @RestController @RequestMapping(path = "/service1")
   class Service1 {
   ...

问题:

执行 POST http://localhost:8080/service1/hello 按预期工作(即过滤器参与请求处理链,并调用服务控制器)。但是,执行 http://localhost:8080//service1/hello(注意双斜杠)将绕过过滤器,但由于 Spring MVC 更宽松的路径匹配算法,无论如何都会到达控制器。

我读到可以自定义控制器路径匹配算法(link:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-config-path-matching),但是我没有找到不忽略双斜杠的选项。

也很重要:此行为意味着任何受过滤器保护的控制器(不是 Spring 安全性,而是任何自定义过滤器)都可以被绕过,只需在URL。我的理解正确吗? 您知道是否可以调整 MVC 控制器路径匹配,以便在路径匹配算法中不会忽略双斜杠?

没有任何迹象表明 Spring MVC 映射和通用 Servlet 过滤器的行为应该相同。 Ant-pattern和Servlet-mapping是不同的标准,//的解释可能是collapsed/normalized也可能不是。

我只想:

A) 为 /* 注册过滤器并在过滤器中进行匹配。

B) 在 Spring.

中设置自定义 AntPathMatcher

C) 在你的过滤器之前注册一个过滤器,规范化 url-path 并在 GET 的情况下拒绝服务 (HTTP 404) 或重定向 (HTTP 301) 到规范化路径。