为什么我在这里看到“访问控制-允许-源不允许源”错误?

我看到以下错误:

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

使用此代码:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);

什么原因导致这种情况,我该如何解决?


答案 1

Javascript 在当前域之外发出 ajax 请求时受到限制。

  • 例如 1:您的域已 example.com,并且您希望向 test.com = >您不能。
  • 例2:您的域名已 example.com,您想向 inner.example.com =>您不能。
  • 例3:您的域名 example.com:80,您想向 example.com:81 发出请求=>您不能
  • EX 4:您的域已 example.com,并且您希望向 example.com = >发出请求。

出于安全原因,Javascript 受到“同源策略”的限制,因此恶意脚本无法联系远程服务器并发送敏感数据。

jsonp是使用javascript的另一种方式。您发出请求,结果被封装到客户端中运行的回调函数中。这与将新脚本标记链接到 html 的 head 部分相同(您知道,您可以在此处从与您的网站不同的域加载脚本)。
但是,要使用 jsonp,必须正确配置服务器。如果不是这种情况,则不能使用jsonp,并且必须依赖服务器端代理(PHP,ASP等)。有很多与此主题相关的指南,只需谷歌它!


答案 2

XMLHttpRequest 不会因为“同源策略”而允许您访问。localhost:8080

您可以通过在以下位置的响应中添加标头来允许来自现代浏览器的请求:localhost:8080

Access-Control-Allow-Origin: *

您可以通过向HTTP服务器添加指令或通过服务器端代码(PHP,Ruby等)添加标头来执行此操作。

在 https://developer.mozilla.org/en/http_access_control 上阅读有关跨域 ajax 请求的更多信息