を読み取り、このリンクあたりHow to read and copy the HTTP servlet response output stream content for logging implementated responsewrapperように応答スプリングインターセプタは、スプリングコントローラの内部応答のOutputStream
HSSFWorkbook workbook = getWorkbook();
OutputStream out = response.getOutputStream();
response.setHeader("pragma", "public");
response.setHeader("Cache-Control", "public");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=sampleexcel.xls");
workbook.write(out);
out.close();
// response.flushBuffer();
にExcelのストリームを書き込みます。以下 は
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
HttpServletResponseCopier resp= new HttpServletResponseCopier(response) ;
byte[] responseData = resp.getCopy();
System.out.println("length "+responseData.length); // its 0 bytes
}
は、基本的には一時ファイルへのOutputStreamの内容を読みたい、インターセプタコードです。次に、暗号化情報を追加します。最後に、この暗号化されたファイルを応答ストリームに書き込みます。 上記のコードでは、resp.getCopy()は空です。したがって、0バイトを一時ファイルに書き込みます。
どのポインタが間違っていますか。これに代わる方法があります。
スプリング3.1、JDK 1.7
ありがとうございます。最初は単純なフィルタを実装してweb.xmlで設定しましたが、コントローラメソッドの終了後は呼び出されませんでした。春の内部フィルタ階層がこのフィルタを呼んでいないか、フィルタチェーン内の順序が間違っている可能性があります。 – Aarati
普通のフィルタはサーブレットコンテナによって直接呼び出され、通常はspring-mvcとは独立しています。しかし、それは* spring-mvcと呼ばれるべきですDispatcherServlet: 'void doFilter(...){/ * before servlet */chain.doFilter(...);}/*サーブレットの後* /} 'リンクされた投稿の回答をもう一度読む... –
最後に、TeeOutputStreamはサーブレット出力ストリームを取得するように働いた。この投稿のおかげでhttps://stackoverflow.com/questions/10457963/spring-rest-service-retrieving-json-from-request – Aarati