レスポンスの内容を処理して完了した後、その情報を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を作成することを推奨します。
- 1. Windows XPおよびWindows 7でシステムオーディオ出力を読み込むにはどうすればよいですか?
- 2. NancyFXにストリーム出力を書き込むにはどうすればよいですか?
- 3. ランダムなレベルを読み込むにはどうすればよいですか?
- 4. テキストヘッダを含むソケット入力ストリームからバイナリファイルを読み取るにはどうすればいいですか?
- 5. テキストファイルを読み込み、Prologのファイルに出力するにはどうすればよいですか?
- 6. JavascriptでRTMPストリームを読むにはどうすればよいですか?
- 7. 標準入力からsedを読み込むにはどうすればよいですか?
- 8. コンソールで1つのキー入力を待って読み込むにはどうすればよいですか?
- 9. テキストファイルを読み込んでコンソールウィンドウに出力するにはどうすればよいですか? Java
- 10. phpのファイルを読み込むにはどうすればいいですか?
- 11. プロパティファイルを読み込むようにLog4jを設定するにはどうすればよいですか?
- 12. Google +のサークル/ストリームを読むにはどうすればいいですか
- 13. 漢字を含むUTF-8でエンコードされたファイルを読み込み、コンソールで正しく出力するにはどうすればよいですか?
- 14. Androidでユーザー入力を読むにはどうすればよいですか?
- 15. テキストと数値のデータを含むファイルを読み込むにはどうすればよいですか?
- 16. ストリームを含むファイルを読み込む
- 17. 「プロセス名」+アドレスのようなポインタから読み込むにはどうすればよいですか?
- 18. Java - 既存のプロセスの出力ストリームを読み込みます。
- 19. php://入力ストリームをバッファから読み込むことはできますか?
- 20. デルファイ6 - それは実行されているように私は、コンソールアプリケーションの出力を読み込むにはどうすればよい
- 21. メインコンテンツ領域にコンテンツを読み込むドロップダウンを行うにはどうすればよいですか?
- 22. パイプにさらに値を書き込んで読み込むにはどうすればいいですか?
- 23. ページの読み込みに素晴らしいフォントなどのWebフォントを読み込むにはどうすればよいですか?
- 24. javascriptで特定のページの読み込みを検出するにはどうすればよいですか?
- 25. JavaでZipファイルからメモリにファイルを読み込むにはどうすればよいですか?
- 26. 提出後にdivタグを再読み込みするにはどうすればよいですか?
- 27. Windowsサービスからコンソール出力をどのように読み込みますか?
- 28. Objective-CでPHP配列を読み込むにはどうすればよいですか?私はPHPで
- 29. Androidでソケット入力ストリームを読み込む方法
- 30. ローカルテキストファイルを読むにはどうすればよいですか?
ええ、Servlet Reponse Wrapperを使用し、出力をキャプチャしたときにキャプチャするのが最良の方法です。 – DyreSchlock
要求を処理するコードは出力ストリームを使用しています。 TeeOutputStreamを使用できます。 (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock
妥当な値は 'BUFFER_SIZE'ですか? – asgs