2016-03-08 480 views
9

在Spring Boot應用程序中,我設置了一個URL映射/service1/*的篩選器。這是通過使用FilterRegistrationBean完成的。Spring MVC路徑匹配忽略雙斜槓//

還有映射到相同的圖案的控制器:

@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

你嘗試過FilterRegistrationBean.setOrder(int)嗎? –

+0

似乎問題出在您的過濾器上,您在網址上匹配的方式在此不正確。如果您使用的是spring 4,請查看http://stackoverflow.com/a/31158112/6401364。或發佈你的過濾器的配置,我們可以提供幫助 – Hani

回答

0

沒有什麼表明Spring MVC映射和泛型Servlet過濾器應該表現相同。 Ant模式和Servlet映射是不同的標準,並且//的解釋可以被摺疊/歸一化或不歸類。

我只想:

A)註冊您的過濾器/*,做在過濾器的匹配。

B)在春季安裝定製AntPathMatcher

C)在過濾器之前註冊一個過濾器,以規範化url-path,並在GET情況下拒絕服務(HTTP 404)或重定向(HTTP 301)到規範化路徑。