Spring MVC Path匹配忽略双斜杠//

Seb*_*ian 10 java spring spring-mvc url-mapping spring-boot

在Spring Boot应用程序中,我已经设置了一个带有url映射的过滤器/service1/*.这是使用a完成的FilterRegistrationBean.

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

   @RestController @RequestMapping(path = "/service1")
   class Service1 {
   ...
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

同样重要的是:这种行为意味着可以绕过任何受过滤器保护的Controller(不是Spring安全性,但任何自定义过滤器),只需在URL的任何部分放置一个双斜杠即可.我的理解是否正确?你知道MVC控制器路径匹配是否可以调整,以便在路径匹配算法中不会忽略双斜杠?

Mor*_*sen 0

没有任何迹象表明 Spring MVC 映射和通用 Servlet 过滤器应该表现相同。Ant-pattern 和 Servlet-mapping 是不同的标准,并且解释//可以折叠/规范化,也可以不折叠/规范化。

我会简单地:

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

B) 在 Spring 中设置自定义AntPathMatcher

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