在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控制器路径匹配,以便在路径匹配算法中不会忽略双斜杠吗?
答案 0 :(得分:0)
没有任何迹象表明Spring MVC映射和通用Servlet过滤器应该表现相同。 Ant模式和Servlet映射是不同的标准,//
的解释可以是折叠/规范化的。
我只想:
A)为/*
注册过滤器,并在过滤器中进行匹配。
B)在Spring中设置自定义AntPathMatcher。
C)在过滤器之前注册一个过滤器,规范化url-path,拒绝服务(HTTP 404)或重定向(HTTP 301)到GET情况下的规范化路径。