这个问题在这里已经有一个答案:

我看到以下错误:

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>

对于本地开发,您可以使用工具来修改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,以调用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).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top