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

我看到以下错误:

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);

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

455412 次浏览

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

  • 例1: 你的域名是 example.com,你想要请求 test.com = > 你不能。
  • 例2: 你的域名是 example.com,你想要请求 inner.example.com = > 你不能。
  • 例3: 你的域名是 example.com: 80,你想要请求 example.com: 81 = > 你不能
  • 例4: 你的域名是 example.com,你可以向 example.com 提出请求。

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

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

XMLHttpRequest 将不允许您到达 localhost:8080,因为“同源策略”。

您可以通过在 localhost:8080上的响应中添加一个头来允许来自现代浏览器的请求:

Access-Control-Allow-Origin: *

您可以通过向 HTTP 服务器添加指令或通过服务器端代码(PHP、 Ruby、 ...)添加头来实现这一点。

阅读更多关于 https://developer.mozilla.org/en/http_access_control上的跨源 Ajax 请求

如果您正在使用 Chrome,一个简单的解决方案(仅用于开发目的)是使用选项 --disable-web-security

与这个问题无关,但是对于任何使用 jQuery 的人来说... ... 如果您试图使用 jQuery 发出 JSONP 请求并忽略神奇的回调参数: callback=?,也会导致这个错误

在解决方案中添加 global.asax。

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

进去

protected void Application_BeginRequest(object sender, EventArgs e)
{
}

如果您来自 Java 背景,一个可能的解决方案是创建一个 servlet,它为您的 javascript 调用 Web 服务。类似于 GET (Your-choice)方法中的下面代码..。

JsonElement jelement;
JsonArray jarray;
try {
URL url = new URL("http://rest."YOUR URL"#ba0482");
URLConnection connection = url.openConnection();
connection.setDoInput(true);
InputStream inStream = connection.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(inStream));


jelement = new JsonParser().parse(input);


jarray = jelement.getAsJsonArray();


response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.print(jarray);
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

现在在 javascript 中简单地将 url 指定为 servlet 名称! !

对于本地开发,您可以使用一个工具来修改 HTTP 响应头。例如,查尔斯可以通过所包含的重写工具 重写工具来实现这一点

只需为目标域/位置添加一个新规则:

Type: Add Header
Where: Response
Replace
Name: Access-Control-Allow-Origin
Value: *
Replace All

如果您使用的是 apache,那么可以这样做: 将其放入/创建一个。在您的公共根目录中添加 htaccess 文件,并添加您可能需要的任何其他文件扩展名。

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>

如果你使用谷歌铬作为浏览器,你可以添加 CORS 扩展,并激活它,它将解决漏洞的问题,而不必改变你的代码中的任何东西

在使用 ajax 访问 php 页面时,我遇到了同样的错误消息(javascript 和 php 文件都位于同一个服务器上)。

原因是我在 JavaScript 中将 IP 地址指定为域。这使浏览器相信对 php 文件的调用在另一台服务器上。

因此,一个简单的解决方案,以摆脱这个错误消息。 A)验证 javascript 和 php 文件在同一台服务器上 B)确保你的 JavaScript (例如 http://www.smartana.co.uk/myJavaScript.js) ajax 中的 url (特别是域名)反映了你的服务器 url (例如 http://www.smartana.co.uk/myServer.php)。

在这里,我们需要为 Apache Http 做两件事

1)在 httpd.config 文件中,取消注释此文件

LoadModule headers_module modules/mod_headers.so

2)在底部加上这条线。

Header set Access-Control-Allow-Origin "*"