Java 在Jasperreports中从服务器接收到多个不同的内容处置标头

Java 在Jasperreports中从服务器接收到多个不同的内容处置标头,java,servlets,http-headers,jasper-reports,Java,Servlets,Http Headers,Jasper Reports,我试图设置内容处置头以响应servlet,但我在浏览器中遇到了这个错误。我该怎么办 从服务器收到重复的头文件 来自服务器的响应 包含重复的标题。这个问题通常是由于 错误配置的网站或代理。只有网站或代理 管理员可以修复此问题 错误349(网络::错误\u响应\u标题\u多个内容\u处置):多个 接收到不同的内容处置标头。这是不允许的 防止HTTP响应拆分攻击 这里是我的servlet控制器: @RequestMapping("/**/paymentOrderReport.pdf"

我试图设置内容处置头以响应servlet,但我在浏览器中遇到了这个错误。我该怎么办

从服务器收到重复的头文件

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

错误349(网络::错误\u响应\u标题\u多个内容\u处置):多个 接收到不同的内容处置标头。这是不允许的 防止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;
    }
}
@RequestMapping(“/**/paymentOrderReport.pdf”)
公共类PaymentOrderReportViewController扩展org.springframework.web.servlet.mvc.AbstractController{
私人支付;
私人JasperPdfView pdfView;
@凌驾
受保护的ModelAndView HandlerRequestInternal(HttpServletRequest请求、HttpServletResponse响应)引发异常{
response.setContentType(“application/pdf”);
response.setHeader(“内容处置”、“附件;文件名=“+”report.pdf”);
PayMentorDeEntity PayMentorDeEntity=null;
字符串traceCode=request.getParameter(ParamConstants.TRACE_代码);
如果(traceCode!=null){
PaymentSheetRequestEntity paymentDao.loadByUniqueProperty(PaymentSheetRequestEntity.PROP_TRACE_代码,
轨迹编码);
if(payRequestEntity!=null){
PayMentorDeEntity=payRequestEntity.getPaymentOrder();
}
}
if(paymentOrderEntity!=null){
列表结果=新建ArrayList();
结果.添加(PayMentorDeEntity);
JRDataSource JRDataSource=新的JRBeanCollectionDataSource(结果);
映射模型=新的HashMap();
model.put(“reportData”,jrDataSource);
返回新模型和视图(pdfView,模型);
}
返回null;
}
公共无效setPaymentDao(PaymentDao PaymentDao){
this.paymentDao=paymentDao;
}
公共无效设置pdfView(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();
    }
    
}
公共类JasperPdfView扩展了AbstractJasperReportsView{
@凌驾
受保护的void renderReport(JasperPrint populatedReport、映射模型、HttpServletResponse)引发异常{
JRPdfExporter JRPdfExporter=新JRPdfExporter();
如果(getConvertedExporterParameters()!=null){
setParameters(getConvertedExporterParameters());
}
jrPdfExporter.setParameter(jreporterParameter.JASPER_PRINT,populatedReport);
jrPdfExporter.setParameter(jreporterParameter.OUTPUT_STREAM,response.getOutputStream());
jrPdfExporter.exportReport();
}
}

这里也有类似的讨论-


查看这是否有帮助

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

读取内容处置头(不属于HTTP规范本身)后,不应包含逗号字符,因为它将被视为两个不同头的分隔符

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

所以,如果你的文件名是报告,May2014.pdf,那么Chrome会解释

内容配置:附件;filename=报告,2014年5月.pdf

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

内容配置:附件;文件名=报告

内容处置:2014年5月.pdf

这反过来又被解释为,可能是因为在一个HTTP响应中实际上不应有多个内容处置头值

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

不正确:

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

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

这方面有进展吗?我也犯了同样的错误有进展吗?我在Chrome浏览器中也遇到了类似的问题(在所有其他浏览器中都没有问题-例如,FF,Safari)