2013-03-24 9 views
5

Sto provando a impostare intestazione content-disposition in risposta a servlet, ma ottengo questo errore nel browser. Cosa dovrei fare?Intestazioni multiple di Content-Disposition distinte ricevute dal server in Jasperreports

intestazioni duplicate ricevuti dal server

La risposta dal server conteneva intestazioni duplicate. Questo problema è generalmente il risultato di un sito Web o di un proxy configurato in modo errato . Solo l'amministratore del sito web o del proxy può risolvere questo problema.

Errore 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): più intestazioni Content-Disposition distinte ricevute. Ciò non è consentito alla protezione contro gli attacchi di divisione della risposta HTTP.

Ecco il mio controller servlet:

@RequestMapping("/**/paymentOrderReport.pdf") 
public class PaymentOrderReportViewController extends org.springframework.web.servlet.mvc.AbstractController { 

    private PaymentDao paymentDao; 
    private JasperPdfView pdfView; 

    @Override 
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 

     response.setContentType("application/pdf"); 
     response.setHeader("Content-disposition", "attachment; filename=" + "report.pdf"); 

     PaymentOrderEntity paymentOrderEntity = null; 
     String traceCode = request.getParameter(ParamConstants.TRACE_CODE); 

     if (traceCode != null) { 
      PaymentSheetRequestEntity payRequestEntity = paymentDao.loadByUniqueProperty(PaymentSheetRequestEntity.PROP_TRACE_CODE, 
        traceCode); 
      if (payRequestEntity != null) { 
       paymentOrderEntity = payRequestEntity.getPaymentOrder(); 
      } 
     } 

     if (paymentOrderEntity != null) { 
      List<PaymentOrderEntity> result = new ArrayList<PaymentOrderEntity>(); 
      result.add(paymentOrderEntity); 
      JRDataSource jrDataSource = new JRBeanCollectionDataSource(result); 

      Map<String, Object> model = new HashMap<String, Object>(); 
      model.put("reportData", jrDataSource); 

      return new ModelAndView(pdfView, model); 
     } 
     return null; 
    } 

    public void setPaymentDao(PaymentDao paymentDao) { 
     this.paymentDao = paymentDao; 
    } 

    public void setPdfView(JasperPdfView pdfView) { 
     this.pdfView = pdfView; 
    } 
} 

E JasperPdfView Classe:

public class JasperPdfView extends AbstractJasperReportsView { 

    @Override 
    protected void renderReport(JasperPrint populatedReport, Map<String, Object> model, HttpServletResponse response) throws Exception { 
     JRPdfExporter jrPdfExporter = new JRPdfExporter(); 
     if (getConvertedExporterParameters() != null) { 
      jrPdfExporter.setParameters(getConvertedExporterParameters()); 
     } 
     jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, populatedReport); 
     jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); 
     jrPdfExporter.exportReport(); 
    } 

} 
+0

Qualche progresso in questo?Sto ottenendo lo stesso errore – dgmora

+0

Qualche progresso? Sto affrontando un problema simile nel browser Chrome (nessun problema in tutti gli altri browser - IE, FF, Safari) –

risposta

14

Go ogle Chrome potrebbe visualizzare questo messaggio di errore se stai scaricando un file che ha una virgola nel nome del file. Stavi davvero usando solo "report.pdf" come nome file?

Dopo aver letto l'HTTP specs l'intestazione Content-Disposition (che non fa parte della specifica HTTP stessa) non deve includere un carattere virgola, poiché verrà trattato come separatore per due intestazioni diverse.

più campi di messaggio-header con lo stesso nome-campo può essere presente in un messaggio se e solo se l'intero campo-valore per quel campo di intestazione è definito come un elenco separato da virgole [cioè, # (valori)]. Deve essere possibile combinare i campi di intestazione multipli in una coppia "nome-campo: campo-valore", senza cambiare la semantica del messaggio, aggiungendo ogni successivo valore-campo al primo, ciascuno separato da una virgola.

Così, se il nome del file fosse rapporto, May2014.pdf quindi Chrome interpreta

Content-Disposition: attachment; filename=report,May2014.pdf

come due valori per la stessa http messaggio di intestazione

Content-Disposition: attachment; filename=report

Content-Disposition: May2014.pdf

quale i n turn è interpretato come HTTP response splitting attack, probabilmente perché non ci devono essere più valori di intestazione Content-Disposition in una singola risposta HTTP.

Altri browser non sembrano preoccuparsi della virgola nel nome del file.

+1

nessun mio nome file è report.pdf. – united

Problemi correlati