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

时间:2016-03-08 03:53:23

标签: java spring spring-mvc spring-boot url-mapping

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

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

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

问题:

执行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控制器路径匹配,以便在路径匹配算法中不会忽略双斜杠吗?

1 个答案:

答案 0 :(得分:0)

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

我只想:

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

B)在Spring中设置自定义AntPathMatcher

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