为什么我在这里看到“访问权限控制”错误的“不允许原点”? [复制
-
26-10-2019 - |
题
这个问题在这里已经有一个答案:
我看到以下错误:
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:您的域是示例。
- 例如2:您的域是示例。
- 例如3:您的域是示例:80,您想提出一个示例请求。.81=>您不能
- 例如4:您的域是示例。
出于安全原因,JavaScript受“相同原始策略”的限制,因此恶意脚本无法联系远程服务器并发送敏感数据。
JSONP 是使用JavaScript的另一种方法。您提出请求,并将结果封装在客户端中运行的回调函数中。这与将新脚本标签链接到HTML的头部部分相同(您知道可以在此处加载来自不同域的脚本)。
但是,要使用JSONP,必须正确配置服务器。如果不是这种情况,则不能使用JSONP,并且必须依靠服务器端代理(PHP,ASP等)。有很多与此主题相关的指南,只需Google IT!
其他提示
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>
在这里,我们需要为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,以调用JavaScript的网络服务。类似于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文件都位于同一服务器上)。
原因是我将IP地址指定为JavaScript中的域。这使浏览器相信对PHP文件的调用在另一台服务器上。
因此,一个简单的解决方案可以摆脱此错误消息。 a)验证JavaScript和PHP文件在同一台服务器上b)确保JavaScript中的URL(尤其是域)(例如 http://www.smartana.co.uk/myjavascript.js)AJAX反映您的服务器URL(例如 http://www.smartana.co.uk/myserver.php).