我看到以下错误:
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);
是什么原因引起的,如何解决?
在当前域之外发出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的另一种方式。您发出请求,结果被封装到在客户端中运行的回调函数中。这与将新脚本标签链接到html的头部相同(您知道可以从与此处不同的域中加载脚本)。
但是,要使用jsonp,必须正确配置服务器。如果不是这种情况,则不能使用jsonp,并且必须依赖服务器端代理(PHP,ASP等)。有很多与此主题相关的指南,只需在Google上搜索即可!
localhost:8080
由于“相同的原产地政策”,XMLHttpRequest将使您无法到达。
您可以通过在响应中添加标头来允许来自现代浏览器的请求localhost:8080
:
Access-Control-Allow-Origin: *
您可以通过向HTTP服务器添加指令或通过服务器端代码(PHP,Ruby等)添加标头来实现。
在https://developer.mozilla.org/en/http_access_control上阅读有关跨域Ajax请求的更多信息
如果您使用的是Chrome,则可以使用option一个简单的解决方法(仅用于开发目的)--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响应标头。例如,查尔斯能够通过附带的重写工具来执行此操作:重写工具
只需使用以下命令为目标域/位置添加新规则:
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 "*"
如果您将google chrome用作浏览器,则可以添加CORS扩展名并将其激活,它将解决孔问题,而无需更改代码中的任何内容
与此特定问题无关,但对于在这种情况下使用jQuery的任何人...如果尝试使用jQuery发出JSONP请求并忽略魔术回调参数,也会导致此错误: callback=?
如果您来自Java背景,那么一种可能的解决方案是制作一个Servlet,该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名称即可!!
使用ajax访问php页面时,我遇到了相同的错误消息(javascript和php文件都位于同一服务器上)。
原因是我在JavaScript中将IP地址指定为域。这使浏览器认为对php文件的调用在另一台服务器上。
因此,摆脱该错误消息的简单解决方案。a)验证javascript和php文件在同一服务器上b)确保JavaScript中的网址(尤其是域)(例如http://www.smartana.co.uk/myJavaScript.js)ajax反映您的服务器网址(例如http://www.smartana.co.uk/myServer.php)。
文章标签:ajax , cors , javascript , xmlhttprequest , youtube-api
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!