2017-08-16 54 views
0

內部彈簧控制器寫入一個Excel流成響應彈簧攔截器讀取應答的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(); 

按照此鏈接How to read and copy the HTTP servlet response output stream content for logging implementated ResponseWrapper此類。 下面是攔截器的代碼,

 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

純過濾器直接由servlet容器調用,並且通常與spring-mvc無關。但它應該被稱爲* around * spring-mvc DispatcherServlet:'void doFilter(...){/ *在servlet */chain.doFilter(...)之前;/*在servlet之後* /}'。再次閱讀鏈接帖子中的答案... –

+0

最後,TeeOutputStream工作來獲取servletoutputstream。感謝這篇文章https://stackoverflow.com/questions/10457963/spring-rest-service-retrieving-json-from-request – Aarati