11

我正在尝试设置 content-disposition 标头以响应 servlet,但我在浏览器中收到此错误。我应该怎么办?

从服务器收到重复的标头

来自服务器的响应包含重复的标头。此问题通常是由于网站或代理配置错误造成的。只有网站或代理管理员可以解决此问题。

错误 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();
    }
    
}
4

3 回答 3

29

如果您正在下载文件名中包含逗号的文件,Google Chrome 可能会显示此错误消息。你真的只使用“report.pdf”作为文件名吗?

阅读HTTP 规范后,Content-Disposition 标头(不是 HTTP 规范本身的一部分)不应包含逗号字符,因为它将被视为两个不同标头的分隔符。

当且仅当该标题字段的整个字段值被定义为逗号分隔列表[即,#(values)] 时,具有相同字段名称的多个消息标题字段可能出现在消息中。必须可以将多个头字段组合成一个“字段名称:字段值”对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔。

因此,如果您的文件名是 report,May2014.pdf,那么 Chrome 会解释

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

作为同一个 http 消息头的两个值

Content-Disposition: attachment; filename=report

Content-Disposition: May2014.pdf

这又被解释为HTTP 响应拆分攻击,可能是因为在单个 HTTP 响应中实际上不应有多个 Content-Disposition 标头值。

其他浏览器似乎不介意文件名中的逗号。

于 2014-05-26T10:30:07.957 回答
1

这里有一个类似的讨论 - http://productforums.google.com/forum/#!topic/chrome/hhZh_kpei8U

看看有没有帮助

于 2013-06-05T05:55:47.780 回答
1

不正确:

response.setHeader("Content-Disposition","attachment;filename="+filename+);

正确的:

response.setHeader("Content-Disposition","attachment;filename=\""+filename+"\"");
于 2019-05-28T17:57:43.220 回答