我很难找到一个问题的解决方案,我认为这个问题很常见,或者可以直接解决,但显然我错了。
我必须重写一些导致问题的网络代码(我没有写)。当用户单击链接时,会向web服务器发送请求,然后web服务器从某处获取或创建PDF文档。返回PDF数据时,Content-Disposition
标头设置为attachment
,浏览器显示"另存为"对话框。
之所以显示另存为对话框,是因为当用户单击链接时,Javascript会将window.location.href
设置为服务器URL(带有一些参数)。
在处理请求时,除了浏览器在选项卡等中显示的动画外,没有其他加载动画。
问题是,如果一个请求挂起或花了一段时间,用户往往会再次单击该链接(可能多次),这意味着对同一资源的请求只会在服务器上不断增加(即使是意外双击链接(这很常见),也会导致两个请求被处理)。
我该如何防止这种情况发生?如果我这样做(window.location.href
替换为window.open
:
var REQUEST_PENDING = false;
function getPDF(param1, param2) {
if (REQUEST_PENDING) return;
REQUEST_PENDING = true;
var w = window.open("/GetPdf.servlet?param1="+param1+"¶m2="+param2);
w.onload = function() {
DOC_REQUEST_PENDING = false;
}
}
那么在任何时候都只处理一个请求,但是只有当返回内容是HTML时,onload回调才有效。当它是一个附件时(这就是我所拥有的),DOC_REQUEST_PENDING变量永远不会设置回false,因此无法进行进一步的请求。
我知道最终的解决方案可能应该在服务器端实现,但不可能实现我在客户端尝试做的事情吗?(我可以使用jQuery)。
@Cory在上面的评论中链接到的问题似乎与我的问题重复,虽然我确信接受的答案非常好,但其中也有一些问题。列表中有另一个问题的答案,它提供了指向这个jquery插件的链接:
http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
无论如何,对我来说,这是最终的解决方案。易于使用,效果极佳。