为什么我在这里看到"origin is not allowed by Access-Control-Allow-Origin"错误?



我看到以下错误:

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

相关内容

最新更新