2017-08-16 5 views
0

を読み取り、このリンクあたり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

答えて

0

Oupsは、スプリングMVCインターセプターは、フィルタはありません。コントローラの実行前、コントローラの実行後およびビュー生成後に呼び出されるフックを提供しますが、応答を置き換えることはできません。

参照先のポストで使用されているフィルタは実際に応答をラッパーに置き換え、応答に書き込まれたすべてが実際にラッパーに入り、書き込まれた時点で処理されます。ここでは、すべてが書き込まれたらラッパーを作成するだけで、何も傍受することはできません。

フィルタとカスタムレスポンスラッパーを実装して目標を達成する必要があります。

+0

ありがとうございます。最初は単純なフィルタを実装してweb.xmlで設定しましたが、コントローラメソッドの終了後は呼び出されませんでした。春の内部フィルタ階層がこのフィルタを呼んでいないか、フィルタチェーン内の順序が間違っている可能性があります。 – Aarati

+1

普通のフィルタはサーブレットコンテナによって直接呼び出され、通常はspring-mvcとは独立しています。しかし、それは* spring-mvcと呼ばれるべきですDispatcherServlet: 'void doFilter(...){/ * before servlet */chain.doFilter(...);}/*サーブレットの後* /} 'リンクされた投稿の回答をもう一度読む... –

+0

最後に、TeeOutputStreamはサーブレット出力ストリームを取得するように働いた。この投稿のおかげでhttps://stackoverflow.com/questions/10457963/spring-rest-service-retrieving-json-from-request – Aarati

関連する問題