web-dev-qa-db-ja.com

HttpServletReponses出力ストリームを読み取るにはどうすればよいですか?

処理されて完了した後に応答のコンテンツを読み取り、その情報をXMLまたはPDFまたはその他の形式で)返すサーブレットフィルターを作成したいのですが、取得する方法がわかりませんHttpServletResponseオブジェクトからの情報。この情報を取得するにはどうすればよいですか?

26
DyreSchlock

これをフィルターに追加Javaファイル。

static class MyHttpServletResponseWrapper 
  extends HttpServletResponseWrapper {

  private StringWriter sw = new StringWriter(BUFFER_SIZE);

  public MyHttpServletResponseWrapper(HttpServletResponse response) {
    super(response);
  }

  public PrintWriter getWriter() throws IOException {
    return new PrintWriter(sw);
  }

  public ServletOutputStream getOutputStream() throws IOException {
    throw new UnsupportedOperationException();
  }

  public String toString() {
    return sw.toString();
  }
}

次のコードを使用します。

HttpServletResponse httpResponse = (HttpServletResponse) response;
MyHttpServletResponseWrapper wrapper = 
  new MyHttpServletResponseWrapper(httpResponse);

chain.doFilter(request, wrapper);

String content = wrapper.toString();

Content変数に出力ストリームがあります。バイナリコンテンツに対しても実行できます。

29
Bruce

春はそのための機能を備えています。あなたがする必要があるすべては、メソッドpublic byte [] getContentAsByteArray()を持つ[ContentCachingResponseWrapper]を使用することです。

デフォルトのResponseWrapperまたはContentCachingResponseWrapperを使用するかどうかに関係なく、構成可能にするWrapperFactoryを作成することをお勧めします。

4
omilus

このようにHttpServletResponseオブジェクトからデータを取得できることはあまり知りません。リクエストが適切なハンドラーにプロキシされ、データ転送オブジェクトとともに渡されるようにアプリケーションを構成すると、適切な最終応答を作成できるため、より適切な場合があります。この方法では、複数の応答オブジェクトを変更したり、そこから読み取る必要はありません。

直接的な回答ではありませんが、それが質問に答える方法です。

1
Stefan Kendall

出力ストリームに書き込むと、サーブレットのフィルターが入力後に呼び出される前に、データがクライアントにフラッシュされる可能性があることを考えると、必ずしもこれを実行できるとは思いません。 iftrueが示唆しているように、XMLを生成し(たとえば)、希望する出力形式で再生成するには、別のアーキテクチャが推奨されます。

編集:iftrueの投稿への応答を読んだ後、reallyが現在の処理に干渉できない場合は、おそらくリクエストをプロキシするサーブレットが必要で、元の出力から出力し、必要に応じて変更します。非常に厄介ですが、:-(

1
Brian Agnew