2009-03-31 11 views

答えて

27

は、フィルタの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(); 

を。

+1

ええ、Servlet Reponse Wrapperを使用し、出力をキャプチャしたときにキャプチャするのが最良の方法です。 – DyreSchlock

+1

要求を処理するコードは出力ストリームを使用しています。 TeeOutputStreamを使用できます。 (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock

+4

妥当な値は 'BUFFER_SIZE'ですか? – asgs

0

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

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

+1

最終的には、私は同じことをして、私が応答のために読む必要がない位置に自分自身を置いています。しかし、私が使用している実際のリクエスト処理は、かなりブラックボックス化されており、混乱することはありません:/ – DyreSchlock

1

出力ストリームに書き込むと、ポピュレーション後にサーブレットフィルタが呼び出される前に、データがクライアントにフラッシュされる可能性があるので、必ずしもこれを行う必要はないと思います。 iftrueが示唆しているように、あなたのXMLを生成したいと思っていて、あなたが望むどんな出力フォーマットでも再生成するためには、別のアーキテクチャが推奨されます。

EDIT:あなた本当には、元の出力からの出力をキャプチャし、おそらくあなたはプロキシにリクエストをサーブレットが必要であり、現在の処理を妨げることができない場合は、iftrueの投稿へのあなたの応答を読みました適切な場合はmungeを実行します。非常に厄介な、しかし:-(

2

Springには機能があります。[ContentCachingResponseWrapper]を使用すると、public byte [] getContentAsByteArray()メソッドが使用されます。

私は、デフォルトのResponseWrapperまたはContentCachingResponseWrapperを使用するかどうかを設定可能にするWrapperFactoryを作成することを推奨します。

関連する問題