为什么在这里看到“ Access-Control-Allow-Origin不允许来源”错误?[重复]

2020/11/06 11:22 · javascript ·  · 0评论

我看到以下错误:

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

本文地址:http://javascript.askforanswer.com/weishenmezaizhelikandao-access-control-allow-originbuyunxulaiyuancuowuzhongfu.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!