【问题标题】:Unable to let the user download PDF from web application无法让用户从 Web 应用程序下载 PDF
【发布时间】:2011-08-23 21:24:54
【问题描述】:

这是控制器类

@Controller
public class ReportController {
    @RequestMapping("/reports.htm")
    public void onSubmit(ModelMap map, HttpServletResponse response) {

        PayrollService ps = new PayrollServiceImpl();

        JRBeanCollectionDataSource jr = new JRBeanCollectionDataSource(ps.listAllLoans(), false);
        try {
            JasperPrint jp = JasperFillManager.fillReport(new FileInputStream("C:\\Documents and Settings\\Administrator\\workspace\\payroll\\WebContent\\WEB-INF\\payrollReports\\report2.jasper"), null, jr);
            JRExporter jre = new JRPdfExporter();
            jre.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "report.pdf");
            jre.setParameter(JRExporterParameter.JASPER_PRINT, jp);

            ServletOutputStream output = response.getOutputStream();
            jre.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
            jre.exportReport();

            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

当我运行这个时,会打开一个对话框,要求下载文件,reports.htm,当我打开文件时,我得到这个

%PDF-1.4 %âãÏÓ 3 0 obj <>stream xœ+är á26S°00SIár á

ä2Rð‰!^´01RÉåÒw3T0²Ò¸44C²@jJ's'5Z~[ë™!t€t€å‹Ò¹4¼‹R‹@(¤c1,:H§€ƒÇCs3C/Parent 4 0 读/内容 3 0 R/类型/页面/资源/字体>>/MediaBox[0 0 595 842]>> endobj 5 0 obj[1 0 R/XYZ 0 854 0] endobj 2 0 obj endobj 4 0 obj endobj 6 0 obj endobj 7 0 obj endobj 8 0 obj/Pages 4 0 R>> endobj 9 0 obj endobj 外部参照 0 10 0000000000 65535 f 0000000220 00000 n 0000000487 00000 n 0000000015 00000 n 0000000574 00000 n 0000000453 00000 n 0000000624 00000 n 0000000677 00000 n 0000000708 00000 n 0000000810 00000 n 预告片 ]/信息 9 0 R/尺寸 10>> startxref 976 %%EOF

但是当我保存文件并使用 adobe PDF 打开时,我得到了正确的 PDF。 如何下载reports.pdf 而不是reports.htm?

【问题讨论】:

  • 你试过用其他浏览器打开报表吗?
  • 将您的 .jasper 文件移到 Web 目录之外。如果我能猜到.jasper 文件的名称,我大概可以下载它。如果我可以下载它,我可以看到 SQL。如果我能看到 SQL,我在你的系统上有一个攻击向量。

标签: java servlets spring-mvc jasper-reports


【解决方案1】:

设置Content-DispositionContent-Type 标头来指示浏览器如何处理资源。

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"report.pdf\"");

【讨论】:

  • 我之前尝试过,但使用的是内联而不是附件。现在我明白了,谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 2018-02-19
  • 2021-09-19
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2021-11-29
  • 2018-02-23
相关资源
最近更新 更多