私のアプリケーションは、後続のgetParameter呼び出しの結果を変更せずにPOSTリクエストのcontent/data/body/payloadを検査する必要がある状況にあります。 InputStreamの本体を読み取るHTTPServletRequestのPOST本体を読み込んでから、TomcatでgetParameterを呼び出します。
:
体はrequest.getReader
からrequest.getInputStream
又はBufferedReaderのからの入力ストリームを使用して読み取ることができます。
読書POSTパラメータ:
POSTリクエストは、通常、要求のボディにリクエストパラメータを含みます。これらはgetParameter
を使用して取得できます。
問題:
最初getParameter
コールは、内部InputStreamを解析し、パラメータのHashMapに全てのパラメータを挿入します。 inputStreamには解析のための内容がまだ含まれている必要があります。したがって、コンテンツを検査することはできず、まだ動作しているgetParameter呼び出しがあります。
提案(しかし、十分ではない)ソリューション
InputStreamをキャッシュしてのgetInputStreamのキャッシュを返す要求ラッパーを作成します。
getParameter
は実際にはgetInputStream
を呼び出すのではなく、要求オブジェクトに埋め込まれている元のinputBufferを参照するため、このソリューションはWeb上で提案されていますが、機能しません。サーブレット内とフィルタを使用して試しました。
私が考えることができる唯一の解決策は、実際にキャッシュされた入力ストリームを手動で解析するようにgetParameterを書き直すことです。しかし、これは悪い考えのように感じます。
誰にでも動作する代替手段はありますか? (これはTomcat 5.5です)これは一般的な使用事例であるように感じます。私はそれがどれほど難しいか信じられない。
この質問に対する答えは解決策ではありません。私はそれを実装しましたが、問題を解決できませんでした。それ以来、私はtomcatのソースを読んで、getParameterはgetInputStreamを呼び出さないことに気付きました。私は上記のように、キャッシュされたストリームのストリームから読み込みません。 http://grepcode.com/file/repo1.maven.org/maven2/tomcat/catalina/5.5.23/org/apache/catalina/connector/RequestFacade.java?av=f#342を参照してください。 私はありませんなぜ人々はそれが解決策であることが分かったのでしょうか。 – rewolf
メソッド 'getParameter'は' getInputStream'を呼び出します。まず、 'getParameter'は' parseParameters'を呼び出し、次に 'parseParameters'は' readPostBody'を呼び出し、 'readPostBody'は' getInputStream'を呼び出します。 – peakmuma