5

ここで、sitebricks の HiddenMethodFilter の実装を見ています。

65 行目に次のコードがあります。

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

特定のパラメーターが設定されているかどうかを確認し、それを使用してリクエストをラップします。ただし、そのパラメーターを読み取ると、ストリームが消費され、最終的なサーブレットはデータを読み取ることができなくなります。

これを回避する最善の方法は何でしょうか? ここでは、ストリームの内容をバイト配列に読み取るHttpServletRequestWrapper を実装しました。ただし、これはリクエストを保存するために大量のメモリを使用する場合があります。

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

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

4

1 に答える 1

2

POSTリクエストを使用していて、これからパラメータを読み取るhttpRequestと、に影響し、InputStreamそれを読み取る必要がある他の部分で問題が発生します。
これは、ServletRequest#getParameterjavadocに記載されています。

HTTP POSTリクエストで発生するように、パラメータデータがリクエスト本文で送信された場合、getInputStream()またはgetReader()を介して本文を直接読み取ると、このメソッドの実行が妨げられる可能性があります。

は、実際には操作なしであるなどServletInputStreamから派生しInputStreamて継承するmarkSupported resetため、をリセットすることはできませんServletInputStream
これはあなたがそれを消費しなければならないことを意味します。

于 2012-04-26T16:40:53.773 に答える