2013-03-24 22 views
5

我試圖在servlet中設置content-disposition標頭,但在瀏覽器中出現此錯誤。我該怎麼辦?從服務器在Jasperreports中從服務器接收到多個不同的Content-Disposition標頭

從 包含重複標頭的服務器的響應中接收

重複報頭。此問題通常是 配置錯誤的網站或代理的結果。只有網站或代理 管理員才能解決此問題。

錯誤349(net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):多個 收到不同的Content-Disposition標頭。這是不允許 防止HTTP響應分裂攻擊。

這裏我的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; 
    } 
} 

而且JasperPdfView類:

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

這方面的進展如何?我得到了同樣的錯誤 – dgmora 2013-06-04 23:50:09

+0

任何進度?我在Chrome瀏覽器中遇到類似問題(所有其他瀏覽器都沒有問題 - IE,FF,Safari) – 2013-06-05 05:52:56

回答

14

圍棋如果您正在下載文件名中包含逗號的文件,則Chrome瀏覽器可能會顯示此錯誤消息。你真的只使用「report.pdf」作爲文件名嗎?

閱讀HTTP specs後,Content-Disposition頭(不屬於HTTP規範本身的一部分)不應包含逗號字符,因爲它將被視爲兩個不同頭的分隔符。

具有相同字段名

多個消息的報頭字段可以存在於一個消息當且僅當該頭字段整個字段值被定義爲逗號分隔的列表[即,#(值)]。它必須能夠將多個頭字段組合成一個「字段名稱:字段值」對,而不改變消息的語義,通過將每個後續字段值附加到第一個字段值,每個字段值都用逗號分隔。

所以,如果你的文件名是報告,May2014.pdf之後,Chrome解釋

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

兩個值相同的HTTP報文頭

Content-Disposition: attachment; filename=report

Content-Disposition: May2014.pdf

其中我回合被解釋爲HTTP response splitting attack,可能是因爲在一個HTTP響應中實際上不應該有多個Content-Disposition標題值。

其他瀏覽器似乎不介意文件名中的逗號。

+1

沒有我的文件名是report.pdf。 – united 2014-05-26 14:57:58

相關問題