レスポンスの内容を処理して完了した後、その情報をXMLやPDFなどで返すServletフィルタを作成したいとします。しかし、HttpServletResponseオブジェクトから情報を取得する方法がわかりません。この情報はどうすれば入手できますか?HttpServletReponses出力ストリームを読み込むにはどうすればよいですか?
答えて
は、フィルタの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();
を。
HttpServletResponseオブジェクトからデータを取得できることはあまりありません。適切なハンドラにプロキシされ、適切な最終応答を作成できるデータ転送オブジェクトを渡すように、アプリケーションを構造化する方が理にかなっています。このようにして、複数の応答オブジェクトを変更したり、そのようなものから読み取る必要はありません。
直接的な回答ではありませんが、私はそれが質問をする方法です。
最終的には、私は同じことをして、私が応答のために読む必要がない位置に自分自身を置いています。しかし、私が使用している実際のリクエスト処理は、かなりブラックボックス化されており、混乱することはありません:/ – DyreSchlock
出力ストリームに書き込むと、ポピュレーション後にサーブレットフィルタが呼び出される前に、データがクライアントにフラッシュされる可能性があるので、必ずしもこれを行う必要はないと思います。 iftrueが示唆しているように、あなたのXMLを生成したいと思っていて、あなたが望むどんな出力フォーマットでも再生成するためには、別のアーキテクチャが推奨されます。
EDIT:あなた本当には、元の出力からの出力をキャプチャし、おそらくあなたはプロキシにリクエストをサーブレットが必要であり、現在の処理を妨げることができない場合は、iftrueの投稿へのあなたの応答を読みました適切な場合はmungeを実行します。非常に厄介な、しかし:-(
Springには機能があります。[ContentCachingResponseWrapper]を使用すると、public byte [] getContentAsByteArray()メソッドが使用されます。
私は、デフォルトのResponseWrapperまたはContentCachingResponseWrapperを使用するかどうかを設定可能にするWrapperFactoryを作成することを推奨します。
ええ、Servlet Reponse Wrapperを使用し、出力をキャプチャしたときにキャプチャするのが最良の方法です。 – DyreSchlock
要求を処理するコードは出力ストリームを使用しています。 TeeOutputStreamを使用できます。 (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock
妥当な値は 'BUFFER_SIZE'ですか? – asgs