为什么我需要CORS标头来请求可下载的链接?

时间:2016-01-28 14:06:31

标签: javascript jquery html xmlhttprequest cross-domain

我有一个链接,允许我在点击它时下载文件。我试图通过一个简单的请求访问它,而不是下载,但我遇到了CORS问题。我没有任何访问服务器端的权限,因此到目前为止我尝试的所有内容都失败了。如果我理解正确,到目前为止我找到的所有建议都需要我控制服务器(我可能会弄错,但据我所知,服务器端需要有一个包含我的域的CORS头或者有一个jsonp函数envoked)。

这是否意味着我无法读取和解析已经可下载的文件?如果是,那么它是如何理解的,因为当我点击链接时文件是公共的并且已经可以下载。由于我手动能够获取文件,是否应该可以使用代码访问它?你能告诉我任何解决方案或给我一些可以解决的问题吗?为什么以下代码无法在浏览器上手动点击?

var urlString = "http://abc.def.com/download?fileid=123&entity_id=123&sid=123";
$.get(urlString, function(data, status){
alert("Data: " + data + "\nStatus: " + status);});

1 个答案:

答案 0 :(得分:1)

您可以通过手动点击指向它的链接来下载外部脚本,因为您手动点击它就可以了!浏览器知道您授权访问该URL,因为您单击了指向该URL的链接。但是如果有一些JavaScript在后台访问该URL,浏览器就无法确定用户是否可以使用它。

你在思考"我只是想下载一个无辜的文件,为什么浏览器不信任我?"但是,让我们考虑一个更可怕的情况。我们说,您的JavaScript试图访问http://innocentsite.com/download,而不是尝试访问https://bankofamerica.com/initiateMoneyTransfer?recipient=OE1&amount=10000。用户甚至不知道它,因为他们登录了bankofamerica.com,所以让你自己发送10,000美元。

现在,显然美国银行(或任何其他值得尊敬的银行)不允许像这样启动10,000美元的转账。但希望这个例子可以解决这个问题 - 网页能够向其他域发出HTTP请求会非常危险。这就是为什么需要CORS标头的原因。

脚注:如果您要托管自己的Web服务器,可以考虑设置代理。您可以在自己的网站上拥有一个自动从其他网站检索文件的网址,并在您的网域上提供该网址。这样,您可以检索文件,而无需其他网站来设置CORS标头。