2016-05-16 54 views
0

一個非常簡單的用例:無法訪問請求負載在彈簧過濾器,當請求類型是WWW的形式,進行了urlencoded

class MyFilter implements Filter { 
    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) { 
     String body = IOUtils.toString(req.getInputStream()); 
     // body is a always empty 
    } 
} 

當我送與內容類型application/json的請求,我得到的實際有效載荷。但是當我將它作爲x-www-form-urlencoded發送時,我不會收到任何數據。我假設其中一個彈簧過濾器已經在使用這些數據,並且我的過濾器沒有任何問題。

請注意,這個問題與我們只能讀取一次數據流無關。我已經想出了這部分,我正在創建另一個HttpServletRequest,其中包含其他過濾器的緩衝輸入流。問題是Spring Boot中的其他內容正在讀取我的所有數據,而沒有任何數據。

我只是想要一種方式來獲得有效載荷。它不一定來自InputStream,如果春天可以給我有效載荷作爲byte[],它將符合我的目的。

我正在使用Spring Boot 1.3.5。

+0

什麼是實現這種過濾器的原因? – RMachnik

+0

因此,我公開了在某些警報情況下觸發的LogEntries webhook。 https://logentries.com/doc/webhookalert/。但是,他們設置了使用有效負載計算的授權令牌,我需要訪問它才能在我身邊進行計算並驗證請求是否合法。 –

+0

你的使用案例類似於:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/AbstractRequestLoggingFilter.html更精確的看你應該仔細看第277行https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/web/filter/AbstractRequestLoggingFilter.java – RMachnik

回答

0

我猜這裏的問題是HiddenHttpMethodFilter它消耗流。

請嘗試通過添加以下代碼,以禁用過濾器,然後檢查是否正常工作

@Bean 
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) { 
    FilterRegistrationBean registration = new FilterRegistrationBean(filter); 
    registration.setEnabled(false); 
    return registration; 
} 
相關問題