为什么我在这里看到“访问控制 – 允许来源不允许的来源”错误?
我看到以下错误:
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的不同方式。 您提出请求并将结果封装到在客户端运行的callback函数中。 这和将一个新的脚本标签链接到你的html的头部(你知道你可以在这里加载不同于你的域的脚本)是一样的。
但是,要使用jsonp,服务器必须正确configuration。 如果不是这种情况,你不能使用jsonp,你必须依靠服务器端代理(PHP,ASP等)。 有很多与这个主题相关的指南,只是谷歌!
由于“同源策略”,XMLHttpRequest不会让你到达localhost:8080
。
您可以通过在localhost:8080
上添加标题来响应现代浏览器的请求localhost:8080
:
Access-Control-Allow-Origin: *
您可以通过向HTTP服务器添加指令或通过服务器端代码(PHP,Ruby,…)添加标头来完成此操作。
阅读https://developer.mozilla.org/en/http_access_control上有关跨源ajax请求的更多信息;
如果您使用的是Chrome,则一个简单的解决方法(仅用于开发目的)是使用选项--disable-web-security
。
在你的解决scheme中添加一个global.asax。
加
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
在
protected void Application_BeginRequest(object sender, EventArgs e) { }
如果你使用apache的话,这个方法是有效的:把它放入/在你的公共根目录下创build一个.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
如果你使用谷歌浏览器作为浏览器,你可以添加CORS扩展,并激活它,它将解决漏洞问题,而不必改变任何代码
在这里,我们需要为Apache Http做两件事情
1)在httpd.config文件中,取消注释该文件
LoadModule headers_module modules/mod_headers.so
2)在底部添加这一行。
Header set Access-Control-Allow-Origin "*"
与这个特定的问题无关,但对于任何人在这种情况下使用jQuery …如果您尝试使用jQuery使JSONP请求,并省略魔术callback参数,也会导致此错误: callback=?
如果你是来自java的背景,一个可能的解决scheme可能是创build一个为您的JavaScript调用Web服务的servlet。 像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文件是在另一台服务器上。
所以一个简单的解决scheme来摆脱这个错误消息。 a)validationjavascript和php文件在同一台服务器上b)确保你的JavaScript(例如http://www.smartana.co.uk/myJavaScript.js )中的url(特别是域名)ajax反映你的服务器url (例如http://www.smartana.co.uk/myServer.php )。