与我的另一个问题:Spring MVC - Downloading PDF using outputstream & HttpServletResponse
我相信我没有收到任何下载的原因是因为我没有在客户端上收到HttpServletResponse。这是因为我的客户端位于与响应所响应的请求URL不同的URL上。我的客户在以下URL上:“ / inventory /”。当客户端单击一个按钮时,它会将包含我需要生成pdf的相关数据的POST发送到/ vm / dormant / pdfReport。该Web应用程序具有数十个控制器,其组织方式使得与模型对象相关的所有数据都通过每个模型的不同URL。在这种情况下,请求访问VM模型对象,因此控制器具有所有VM相关任务的以/ vm /开头的URL。
问题是,用户在页面/ inventory /上,单击按钮会将POST响应发送到/ vm / dormant / pdfReport,并且控制器成功接收到请求并生成PDF文件。但是响应返回到/ vm / dormant / pdfReport,这不是客户端所在的URL。如何将响应发送回/ inventory /而不是/ vm / dormant / pdfReport?
我已经研究了转发和重定向,但是我认为这都不是我想要的行为。如何将响应发送到正确的URL?
我相关的JSP:
$("#downloadReport").click(function(){
idleVmReport();
});
function idleVmReport(){
var url = "/vm/dormant/";
$.post(url, {sdkUrl:$("#slVcenterUrl").val(), threshold:$("#searchDate").val()}, function(data){
console.log("pdf request");
}).fail(function(){
console.log("pdf request failed");
});
}
<button type="button" id="downloadReport" class="btn btn-default btn-etc btn-small"><i class="icon-save"></i> Download PDF</button>
相关控制器代码:
@RequestMapping("/vm/dormant/pdfReport") {
public void exportIdleVMReport(@RequestParam(value = "sdkUrl", required = true) String sdkUrl,
@RequestParam(value = "threshold", required = false, defaultValue = "30") int threshold,
HttpServletRequest request, HttpServletResponse response) {
//Try catch and other things omitted
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", fileName);
response.setHeader(headerKey, headerValue);
ServletOutputStream outputStream=response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
outputStream.flush();
outputStream.close();
}
您发送ajax请求吗?如果是这样,那么您就不会有这样的问题,因为发送请求的人都会收到响应。您是否可以检查是否收到标题为Content-Disposition =“ ****”的响应;如果是这样,导出PDF的方式一定是错误的。