2017-08-16 2 views
0

Innenfeder Controller schreibt eine Excel-Strom in ReaktionFrühling Abfangjäger lesen Antwort Output

 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(); 

Gemäß diesem Link How to read and copy the HTTP servlet response output stream content for logging implementated responsewrapper. Im Folgenden finden Sie Code Interceptor,

 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 

    } 

Grundsätzlich ist die Output Inhalt in eine temporäre Datei lesen möchten. Fügen Sie dann Verschlüsselungsinformationen hinzu. Schreiben Sie diese verschlüsselte Datei schließlich in den Antwortstream. Im obigen Code ist resp.getCopy() leer und schreibt daher 0 Bytes in die temporäre Datei.

Irgendwelche Hinweise, was falsch ist. Gibt es alternative Möglichkeiten, dies zu tun.

Frühling 3.1, JDK 1.7

Antwort

0

Oups, eine Feder-mvc Interceptor ist kein Filter. Es bietet Hooks, die vor der Controller-Ausführung, nach der Controller-Ausführung und nach der Ansichtserstellung aufgerufen werden, aber die Antwort nicht ersetzen können.

Der im referenzierten Post verwendete Filter ersetzt die Antwort tatsächlich durch einen Wrapper, sodass alles, was in die Antwort geschrieben wird, tatsächlich in den Wrapper gelangt und zum Zeitpunkt des Schreibens verarbeitet wird. Hier erstellen Sie den Wrapper erst, nachdem alles geschrieben wurde, so dass er nur nichts abfangen kann.

Sie müssen einen Filter und einen benutzerdefinierten Antwort-Wrapper implementieren, um Ihr Ziel zu erreichen.

+0

Danke für Info. Zu Beginn wurde ein einfacher Filter implementiert und in web.xml konfiguriert, jedoch wurde er nach dem Beenden der Controller-Methode nicht aufgerufen. Mag sein, dass die interne Filterhierarchie im Frühjahr diesen Filter nicht aufruft oder die Reihenfolge in der Filterkette falsch ist. Alle Zeiger in dieser Richtung würden geschätzt werden. – Aarati

+1

Einfache Filter werden direkt vom Servlet-Container aufgerufen und sind normalerweise unabhängig von spring-mvc. Aber es sollte * um * spring-mvc DispatcherServlet heißen: 'void doFilter (...) {/ * vor Servlet */chain.doFilter (...);/* nach dem Servlet * /} '. Lesen Sie noch einmal die Antwort im verknüpften Post ... –

+0

Schließlich arbeitete TeeOutputStream, um servletoutputstream abzurufen. Danke an diesen Beitrag https://stackoverflow.com/questions/10457963/spring-rest-service-retrieving-json-from-request – Aarati