2015-11-17 69 views
2

我需要原樣將原始HTTP請求數據代理到另一個HTTP端點。Spring MVC破壞的請求參數處理

Spring MVC變異了HttpServletRequest實例,並且在我有機會在我的控制器方法中檢查它之前消耗request.getInputStream(),並且它以空流形式結束。

此外,Spring MVC將查詢字符串參數與POST主體參數混合在一起,但只有當輸入Content-Typeapplication/x-www-form-urlencoded時。爲了正確的代理行爲,這不能做。被代理的HTTP端點對維護單獨的查詢字符串與POST主體參數非常敏感。因爲我不能依賴Spring MVC來不破壞傳入的請求狀態,所以我需要完全繞過MVC並註冊一個獨立的Servlet,我需要訪問未經Spring修改的原始HTTP輸入。

我的應用程序是一個Spring Boot(1.2.5)應用程序,作爲WAR部署到Tomcat 8上,但有一個static void main在開發機器上啓動嵌入式Tomcat 8。

如何創建獨立的Servlet來處理此代理邏輯?我試過ServletRegistrationBean來註冊servlet,但是這仍然會破壞Spring默認過濾器的傳入請求。我需要排除這些過濾器並重新開始。

回答

0

我能夠通過禁用HiddenHttpMethodFilter來解決MVC消耗POST正文的最初問題。

@Bean 
public FilterRegistrationBean hiddenHttpMethodFilterRegistration(HiddenHttpMethodFilter filter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter); 
    registration.setFilter(filter); 
    registration.setEnabled(false); 
    return registration; 
}