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

Javascript 为什么我需要CORS标头来请求可下载链接?,javascript,jquery,html,xmlhttprequest,cross-domain,Javascript,Jquery,Html,Xmlhttprequest,Cross Domain,我有一个链接,当我点击它时,它允许我下载一个文件。我不是下载,而是尝试通过一个简单的请求访问它,但是我遇到了CORS问题。我没有访问服务器端的任何权限,因此到目前为止我尝试的所有操作都失败了。如果我理解正确,到目前为止我发现的所有建议都需要我控制服务器(我可能弄错了,但据我所见,服务器端需要有一个包含我的域的CORS头,或者有一个要envoke的jsonp函数) 这是否意味着我无法读取和解析已经可以下载的文件?如果是,这有什么意义,因为当我点击链接时,该文件是公开的,并且已经可以下载了。既然我可

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

这是否意味着我无法读取和解析已经可以下载的文件?如果是,这有什么意义,因为当我点击链接时,该文件是公开的,并且已经可以下载了。既然我可以手动获取文件,难道不能用代码访问它吗?你能给我一些解决方案或是我能做的事情吗?为什么下面的代码不能像手动点击浏览器那样工作

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

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

你在想:“我只是想下载一个无辜的文件,为什么浏览器不信任我?”但是让我们考虑一个更可怕的场景。比方说,不要试图访问

http://innocentsite.com/download
,您的JavaScript试图访问
https://bankofamerica.com/initiateMoneyTransfer?recipient=OE1&amount=10000
。用户登录bankofamerica.com后,在不知情的情况下,刚刚让你给自己发送了10000美元

现在,很明显,美国银行(或任何其他值得尊敬的银行)不允许像这样发起10000美元的转账。但希望这个例子能让人明白这一点——网页能够向其他域发出HTTP请求是非常危险的。这就是为什么需要CORS头的原因



注:如果您正在托管自己的web服务器,您可能会考虑设置代理。您可以在您的网站上有一个URL,该URL自动从其他网站检索文件,并在您的域中提供该文件。这样,您就可以在不需要其他网站设置CORS头的情况下检索该文件。

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

你在想:“我只是想下载一个无辜的文件,为什么浏览器不信任我?”但是让我们考虑一个更可怕的场景。比方说,不要试图访问

http://innocentsite.com/download
,您的JavaScript试图访问
https://bankofamerica.com/initiateMoneyTransfer?recipient=OE1&amount=10000
。用户登录bankofamerica.com后,在不知情的情况下,刚刚让你给自己发送了10000美元

现在,很明显,美国银行(或任何其他值得尊敬的银行)不允许像这样发起10000美元的转账。但希望这个例子能让人明白这一点——网页能够向其他域发出HTTP请求是非常危险的。这就是为什么需要CORS头的原因



注:如果您正在托管自己的web服务器,您可能会考虑设置代理。您可以在您的网站上有一个URL,该URL自动从其他网站检索文件,并在您的域中提供该文件。这样,您就可以在不需要其他网站设置CORS标题的情况下检索该文件。

从我读过的内容开始学习,但是对于可下载的url来说,这不是不同吗?我的意思是,一旦我点击它,我就会下载它,所以感觉应该可以获得信息而不是下载它?如果除非服务器端启用,否则根本不可能,那么当我单击时浏览器发送的请求与代码发送的请求之间有什么区别?如果我无法下载,我会理解保护策略,但因为我知道我的计算机可以访问某个数据,为什么我不能具体说明我的电脑会用它做什么?看来你还没有仔细阅读。关键是,大多数浏览器不允许客户端脚本执行对外部资源的请求。这并不重要,它是否可以下载,从我读到的开始学习,但是对于一个可下载的url来说,这不是不同吗?我的意思是,一旦我点击它,我就会下载它,所以感觉应该可以获得信息而不是下载它?如果除非服务器端启用,否则根本不可能,那么当我单击时浏览器发送的请求与代码发送的请求之间有什么区别?如果我无法下载,我会理解保护策略,但因为我知道我的计算机可以访问某个数据,为什么我不能具体说明我的电脑会用它做什么?看来你还没有仔细阅读。关键是,大多数浏览器不允许客户端脚本执行对外部资源的请求。没关系,它是否可以下载,哇。所以问题是,只要能够访问一个文件,我就可以调用服务器域中的任何函数,对吗?我认为请求一个公共文件和调用一个函数(或者请求一个非公共数据)是不同的事情。能做任何事或什么都不做有点奇怪。是的,因为你的浏览器根本无法区分下载无辜文件的URL和引爆核弹头的URL。如果能使用网站就好了