2012-04-26 2 views
5

私は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; 
    } 
}; 
} 

良い方法はありますか?ストリームを消費せずにパラメータを読み取ることはできますか? (覗き見に類似したもの)ストリームをリセットできますか?

答えて

2

httpRequestからPOSTリクエストと読み取りパラメータを使用している場合、これはInputStreamに影響し、それを読み取る必要がある他の部分で問題が発生します。パラメータデータがリクエストボディで送信された場合、 のgetInputStream()またはgetReader介して直接本体を読み取る、HTTP POSTリクエストで を生じるような)(


これはServletRequest#getParameterのJavadocに記載されていますこのメソッドの実行を妨げる可能性があります。

ServletInputStreamInputStream由来し、実際には-OPSではないので、あなたがServletInputStreamをリセットすることはできませんmarkSupportedresetなどを継承しています。
これは、消費する必要があることを意味します。

+0

Webページからメタデータをリクエストボディに入れる必要のないサーブレットコンテナに変換する方法はありますか? –

+0

POSTの代わりにGETを使用します。あるいは、特定の機能要件の代替アプローチを探して、身体を複数回読む必要はありません。 – BalusC

+0

@UsmanIsmail:入力ストリームを一度読み込み、バッファリングして、それを読み取る必要があるさまざまなコンポーネントに渡します。 – Jim

関連する問題