我看到以下错误:
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);
是什么原因导致了这种情况,我该如何解决?
Javascript在当前域之外发出ajax请求时受到限制。
- 示例1:你的域是example.com,而你想向test.com请求=>你不能
- 示例2:您的域是example.com,而您想向inner.example.com=>发出请求,则无法
- 示例3:你的域是example.com:80,而你想向example.com:81=>提出请求,你不能
- 你的域名是example.com,如果你想向example.com请求=>你可以
出于安全原因,Javascript受到"同源策略"的限制,因此恶意脚本无法联系远程服务器并发送敏感数据。
jsonp是使用javascript的另一种方式。您发出一个请求,结果被封装到一个回调函数中,该函数在客户端中运行。这与将一个新的脚本标记链接到html的头部是一样的(你知道你可以从不同的域加载脚本)
但是,要使用jsonp,必须正确配置服务器。如果不是这样的话,你不能使用jsonp,你必须依赖服务器端代理(PHP,ASP等)。有很多与这个主题相关的指南,只需谷歌一下!
XMLHttpRequest将不允许您访问localhost:8080
。
您可以通过在localhost:8080
:上的响应中添加标头来允许来自现代浏览器的请求
Access-Control-Allow-Origin: *
您可以通过向HTTP服务器添加指令或通过服务器端代码(PHP、Ruby…)添加头来实现这一点
阅读更多关于跨源ajax请求的信息https://developer.mozilla.org/en/http_access_control
如果您正在使用Chrome,一个简单的解决方法(仅用于开发目的)是使用选项--disable-web-security
。
在您的解决方案中添加一个global.asax。
添加
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
在中
protected void Application_BeginRequest(object sender, EventArgs e)
{
}
如果您使用的是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>
对于本地开发,您可以使用一个工具来修改HTTP响应标头。例如,Charles可以通过包含的重写工具做到这一点:重写工具
只需为目标域/位置添加一个新规则:
Type: Add Header
Where: Response
Replace
Name: Access-Control-Allow-Origin
Value: *
Replace All
这里,我们需要为Apache Http 做两件事
1) 在httpd.config文件中,取消注释此文件
LoadModule headers_module modules/mod_headers.so
2) 在底部添加此行。
Header set Access-Control-Allow-Origin "*"
如果您使用谷歌chrome作为浏览器,您可以添加CORS扩展并激活它,它将解决漏洞问题,而无需更改代码中的任何内容
与这个特定的问题无关,但对于任何使用jQuery的人来说。。。如果您尝试使用jQuery发出JSONP请求并省略魔术回调参数:callback=?
如果您来自java背景,一个可能的解决方案可能是制作一个servlet,该servlet为您的javascript调用Web服务。类似于GET(您的选择)方法中的以下代码。。。
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名称!!
在使用ajax访问php页面时,我遇到了相同的错误消息(javascript和php文件都位于同一服务器上)。
原因是我在JavaScript中指定了IP地址作为域。这使得浏览器相信对php文件的调用在另一台服务器上。
因此,一个简单的解决方案可以消除这个错误消息。a) 验证javascript和php文件在同一服务器上b) 确保JavaScript中的url(特别是域)(例如。http://www.smartana.co.uk/myJavaScript.js)ajax反映您的服务器url(例如。http://www.smartana.co.uk/myServer.php)。