基本的AJAX请求获得“No’Access-Control-Allow-Origin’标头出现在请求的资源上”错误
我尝试向jQuery AJAX请求中的某个链接发送一个简单的GET
请求。
这是一个非常简单的:
$.ajax({ type: 'GET', url: /* */, dataType: 'text/html', success: function() { alert("Success"); }, error: function() { alert("Error"); }, });
但是,无论我尝试过什么,我都得到XMLHttpRequest cannot load . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:7776' is therefore not allowed access.
XMLHttpRequest cannot load . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:7776' is therefore not allowed access.
我尝试了所有方法,从添加header : {}
定义到AJAX请求到将dataType
设置为JSONP
,甚至是text/plain
,使用简单的AJAX而不是jQuery,甚至下载一个启用CORS的插件 – 但没有什么可以帮助。
如果我试图访问任何其他网站,也会发生同样的情况。
有关正确和简单解决方案的任何想法? 有没有?
这是设计的。 您不能使用XMLHttpRequest向另一台服务器发出任意HTTP请求,除非该服务器通过为请求主机发出Access-Control-Allow-Origin标头来允许它。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
您可以在脚本标记中检索它(对脚本和图像以及样式表没有相同的限制),但除非返回的内容是脚本,否则它对您没有多大帮助。
这是一篇关于CORS的教程:
这样做是为了保护最终用户。 假设一个图像实际上是一个图像,样式表只是一个样式表,而一个脚本只是一个脚本,从另一个服务器请求这些资源实际上不会造成任何伤害。
但总的来说,跨域请求可以做很糟糕的事情。 说你,Zoltan,正在使用coolsharks.com。 另请注意,您已登录mybank.com并且浏览器中有mybank.com的cookie。 现在,假设coolsharks.com向mybank.com发送了一个AJAX请求,要求将所有资金转入另一个帐户。 因为您存储了mybank.com cookie,所以他们成功完成了请求。 所有这些都是在您不知情的情况下发生的,因为没有发生页面重新加载。 这是允许一般跨站点AJAX请求的危险。
如果要执行跨站点请求,您有两种选择:
- 获取您要求的服务器
一个。 通过推出包含您(或*)的Access-Control-Allow-Origin标头来承认
湾 为您提供JSONP API。
要么
- 编写自己的浏览器,不符合标准,没有任何限制。
在(1)中,您必须与您要求的服务器合作,并且在(2)中,您必须控制最终用户的浏览器。 如果你不能满足(1)或(2),你几乎没有运气。
但是,还有第三种选择(charlietfl指出)。 您可以从您控制的服务器发出请求,然后将结果传回页面。 例如
然后在您的服务器上,最简单的:
当然,这种方法可能遇到其他问题:
- 您是代理的网站是否需要正确的推荐人或某个IP地址?
- cookie是否需要传递到目标服务器?
- 您的白名单是否足以保护您免受任意请求的影响?
- 当您的服务器收到它们时,您会将哪些标题(例如修改时间等)传递回浏览器,哪些标题会被省略或更改?
- 您的服务器是否会因为提出非法请求而受到牵连(因为您作为代理人)?
我确定还有其他人。 但如果这些问题都没有阻止它,那么第三种方法可以很好地发挥作用。
您可以询问该域的开发人员是否会为您设置合适的标头,此限制仅适用于javascript,基本上您可以使用php或其他任何方式从您的服务器请求ressource,然后javascript请求您的域中的数据