我看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相似)我們可以重置流嗎?
有沒有其他方法可以從網頁獲取元數據到servlet容器,而不需要數據在請求體中? – 2012-04-26 17:01:27
使用GET而不是POST。或者尋找特定功能需求的替代方法,以便您不需要多次閱讀身體。 – BalusC 2012-04-26 18:47:40
@UsmanIsmail:讀取輸入流一次,緩衝並將其傳遞到需要讀取它的各種組件 – Jim 2012-04-27 05:48:52