2013-03-24 15 views
5

Próbuję ustawić nagłówek treści w odpowiedzi na serwlet, ale pojawia się ten błąd w przeglądarce. Co powinienem zrobić?Wiele różnych nagłówków Content-Disposition odebranych z serwera w Jasperreports

zduplikowane nagłówki otrzymane od serwera

Odpowiedź z serwera zawartych zduplikowane nagłówki. Ten problem jest zazwyczaj wynikiem nieprawidłowej konfiguracji witryny lub serwera proxy. Tylko administrator witryny lub proxy może naprawić ten problem.

Błąd 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): otrzymano wiele różnych nagłówków Content-Disposition. Jest to niedozwolone na ochronę przed atakami polegającymi na dzieleniu odpowiedzi HTTP.

Oto mój kontroler 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; 
    } 
} 

I JasperPdfView Klasa:

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

Jakieś postępy w tym?Otrzymuję ten sam błąd – dgmora

+0

Jakieś postępy? Mam do czynienia z podobnym problemem w przeglądarce Chrome (bez problemów we wszystkich innych przeglądarkach - IE, FF, Safari) –

Odpowiedz

14

Go ogle Chrome może wyświetlić ten komunikat o błędzie, jeśli pobierasz plik z przecinkiem w nazwie pliku. Czy naprawdę używasz "report.pdf" jako nazwy pliku?

Po przeczytaniu HTTP specs nagłówek Content-Disposition (który nie należy do specyfikacji HTTP) nie powinien zawierać znaku przecinka, ponieważ będzie traktowany jako separator dla dwóch różnych nagłówków.

Wiele pól wiadomości-nagłówek z tego samego pola-nazwy mogą występować w wiadomości tylko wtedy, gdy całe pole wartość dla tego pola nagłówka jest zdefiniowany jako lista oddzielonych przecinkami [tj # (wartości)]. MUSI być możliwe łączenie wielu pól nagłówka w jedną parę "nazwa-pola: wartość pola", bez zmiany semantyki komunikatu, poprzez dołączanie każdej kolejnej wartości pola do pierwszej, z których każda jest oddzielona przecinkiem.

Więc jeśli nazwa pliku były Raport May2014.pdf następnie Chrome interpretuje

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

jako dwie wartości dla nagłówka komunikatu samo http

Content-Disposition: attachment; filename=report

Content-Disposition: May2014.pdf

który i n turn jest interpretowany jako HTTP response splitting attack, prawdopodobnie dlatego, że w pojedynczej odpowiedzi HTTP nie będzie w rzeczywistości żadnych wartości nagłówka Content-Disposition.

Inne przeglądarki nie mają nic przeciwko przecinkowi w nazwie pliku.

+1

brak nazwy pliku to report.pdf. – united