2012-04-26 69 views
5

我看HiddenMethodFilter的sitebricks here實現:是否可以在不消耗流的情況下讀取HttpRequest參數?

在65行有下面的代碼:

try { 
    String methodName = httpRequest.getParameter(this.hiddenFieldName); 
    if ("POST".equalsIgnoreCase(httpRequest.getMethod()) && !Strings.empty(methodName)) { 
    .... 

它檢查特定的參數設置,並使用該包裝的要求。但是,在讀取該參數時,它將使用流,最終的servlet將無法讀取任何數據。

什麼是避免這種情況的最好方法?我實現了HttpServletRequestWrapper here,它將流的內容讀入一個字節數組。然而,這可能會使用大量內存來存儲請求。

private HttpServletRequestWrapper getWrappedRequest(HttpServletRequest httpRequest, final byte[] reqBytes) 
    throws IOException { 

final ByteArrayInputStream byteInput = new ByteArrayInputStream(reqBytes); 
return new HttpServletRequestWrapper(httpRequest) { 

    @Override 
    public ServletInputStream getInputStream() throws IOException { 
    ServletInputStream sis = new ServletInputStream() { 

     @Override 
     public int read() throws IOException { 
     return byteInput.read(); 
     } 
    }; 
    return sis; 
    } 
}; 
} 

有沒有更好的方法?我們可以讀取參數而不消耗流? (有些東西與peek相似)我們可以重置流嗎?

回答

2

如果您使用POST請求並從httpRequest讀取參數,這將影響InputStream,並且您在其他需要讀取它的部分會遇到問題。

()如果參數數據在請求體中發送,例如具有HTTP POST請求發生 ,然後直接通過 的getInputStream()或getReader讀取體:
這在ServletRequest#getParameter Javadoc中陳述可能會干擾此方法的執行。

ServletInputStreamInputStream派生和繼承markSupportedreset等,這實際上是空操作,所以你不能重置ServletInputStream
這意味着你將不得不使用它。

+0

有沒有其他方法可以從網頁獲取元數據到servlet容器,而不需要數據在請求體中? – 2012-04-26 17:01:27

+0

使用GET而不是POST。或者尋找特定功能需求的替代方法,以便您不需要多次閱讀身體。 – BalusC 2012-04-26 18:47:40

+0

@UsmanIsmail:讀取輸入流一次,緩衝並將其傳遞到需要讀取它的各種組件 – Jim 2012-04-27 05:48:52

相關問題