私はsitebricks hereでHiddenMethodFilterの実装を探しています:ストリームを消費せずにHttpRequestパラメータを読み取ることは可能ですか?
次のコードがある行65で:
try {
String methodName = httpRequest.getParameter(this.hiddenFieldName);
if ("POST".equalsIgnoreCase(httpRequest.getMethod()) && !Strings.empty(methodName)) {
....
それは、特定のパラメータが設定されたかどうかを確認し、その要求をラップするために使用しています。ただし、そのパラメータを読み取ると、ストリームを消費し、最終的なサーブレットはデータを読み取ることができなくなります。
これを避けるにはどうすればよいでしょうか?私はストリームの内容をバイト配列に読み込む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;
}
};
}
良い方法はありますか?ストリームを消費せずにパラメータを読み取ることはできますか? (覗き見に類似したもの)ストリームをリセットできますか?
Webページからメタデータをリクエストボディに入れる必要のないサーブレットコンテナに変換する方法はありますか? –
POSTの代わりにGETを使用します。あるいは、特定の機能要件の代替アプローチを探して、身体を複数回読む必要はありません。 – BalusC
@UsmanIsmail:入力ストリームを一度読み込み、バッファリングして、それを読み取る必要があるさまざまなコンポーネントに渡します。 – Jim