我正在尝试设置内容处置标头以响应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();
}
}
答案 0 :(得分:18)
如果您要下载文件名中包含逗号的文件,则Google Chrome可能会显示此错误消息。你真的只使用&#34; report.pdf&#34;作为文件名?
读取HTTP specs Content-Disposition标头(不属于HTTP规范本身)不应包含逗号字符,因为它将被视为两个不同标头的分隔符。
当且仅当该标题字段的整个字段值被定义为以逗号分隔的列表[即#(值)]时,具有相同字段名称的多个消息标题字段可以出现在消息中。必须可以将多个标题字段组合成一个&#34;字段名称:字段值&#34;通过将每个后续字段值附加到第一个字段值,每个字符值以逗号分隔,而不更改消息的语义。
因此,如果您的文件名是报告,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 :(得分:1)
此处有类似的讨论 - http://productforums.google.com/forum/#!topic/chrome/hhZh_kpei8U
看看是否有帮助
答案 2 :(得分:0)
错误:
response.setHeader("Content-Disposition","attachment;filename="+filename+);
正确:
response.setHeader("Content-Disposition","attachment;filename=\""+filename+"\"");