2012-08-06 73 views
1

我遇到了here這個問題,但我不清楚該如何解決它。春季:在閱讀inputStream後如何使用@RequestBody

問題是我有一個AuthenticationProvider必須讀取請求的主體。但是,當我的控制器方法想通過@RequestMapping使用這些數據時,它是空的,因爲Provider已經讀取了inputStream。

有沒有一種方法可以從支持標記/重置的請求中獲取inputReader,這樣我的提供者就可以在認證之後簡單地將流回滾到它的初始狀態?看起來很瘋狂,過濾器的默認行爲是對請求對象的破壞性修改。

回答

3

提供者只能在特定情況下觸發,因此它不應該影響您的整個應用程序。但是,如果你需要在由供應商處理的請求的身體,那麼你仍然有一種變通方法:

  1. 實現servlet Filter
  2. 包裝要求在包裝緩存
  3. 請求體,然後覆蓋getInputStream()方法以返回帶有緩存的請求主體的ByteArrayInputStream。這樣它可以閱讀多次。

spring的AbstractRequestLoggingFilter做了類似的事情,並有一個示例包裝,你可以檢查它。

+0

聽起來很可能;只是爲了支持我的理解,「包裝請求」意味着擴展ServletRequest,並在我調用chain.doFilter(request,response)時傳遞該請求。 提供者確實只在特定情況下被觸發,但當然,觸發的情況是我需要提供者中的主體和處理者方法的情況。無論如何,謝謝,我會盡快接受答案。 – Ben 2012-08-06 18:32:22

+0

是的,有'HttpServletRequestWrapper'幫助你 - 擴展它,實例化它,傳遞原始請求,並委託所有方法,除了被覆蓋的方法 – Bozho 2012-08-06 19:33:41