GVKun编程网logo

JSONP跨源错误“不存在Access-Control-Allow-Origin标头”(org.json不存在)

17

在本文中,您将会了解到关于JSONP跨源错误“不存在Access-Control-Allow-Origin标头”的新资讯,同时我们还将为您解释org.json不存在的相关在本文中,我们将带你探索JSO

在本文中,您将会了解到关于JSONP跨源错误“不存在Access-Control-Allow-Origin标头”的新资讯,同时我们还将为您解释org.json不存在的相关在本文中,我们将带你探索JSONP跨源错误“不存在Access-Control-Allow-Origin标头”的奥秘,分析org.json不存在的特点,并给出一些关于Access-Control-Allow-Origin 标头如何工作? - How does Access-Control-Allow-Origin header work?、AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误、angularjs – 请求标头字段Access-Control-Allow-Origin在预检响应中不允许使用Access-Control-Allow-Origin、angularjs-$http.post请求标头字段Access-Control-Allow-Headers错误不允许Access-Control-Allow-Origin的实用技巧。

本文目录一览:

JSONP跨源错误“不存在Access-Control-Allow-Origin标头”(org.json不存在)

JSONP跨源错误“不存在Access-Control-Allow-Origin标头”(org.json不存在)

我正在使用Ajax使用其API从Twitter获取数据。我正在尝试使用jsonp,从我所能看到和理解的角度来看,我认为我所做的一切都正确(显然不是)。

>     <script> src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">> </script>>     <script>>         $(document).ready(function () {>             $.ajax( {>                 type: ''GET'',>                 datatype: ''jsonp'',>                 data: {},>                 crossDomain: ''true'',>                 url:> "http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=?",>                 error: function(textStatus, errorThrown) {>                     alert("error");>                 },>                 success: function(msg) {>                     console.log(msg);>                 }>             });>         });>     </script>

上面的代码在Chrome和Firefox中均生成错误 XMLHttpRequest无法加载
http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=?。所请求的资源上没有“
Access-Control-Allow-Origin”标头。因此,不允许访问原始“空”。

根据我的理解,我认为将&callback=?和设置为jsonp可以使此方法成功。更重要的是,我可以看到在提琴手中返回的JSON对象只是脚本没有处理。我尝试了多个API发生相同的问题。

当输入地址栏时,一种这样的API也可以使用。

因此,经过大量搜索和查找,我是否需要将原点设置为*?我认为这更多是服务器方面的问题?

我也尝试过,?callback?但无济于事。

任何想法都将非常感谢。

答案1

小编典典

上述资源支持JSONP,所以没有必要CORS …问题是datatype: ''jsonp''它应该是dataType: ''jsonp''

$(document).ready(function () {    $.ajax({        type: ''GET'',        dataType: ''jsonp'',        data: {},        url: "http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=?",        error: function (jqXHR, textStatus, errorThrown) {            console.log(jqXHR)        },        success: function (msg) {            console.log(msg);        }    });});

演示:小提琴

Access-Control-Allow-Origin 标头如何工作? - How does Access-Control-Allow-Origin header work?

Access-Control-Allow-Origin 标头如何工作? - How does Access-Control-Allow-Origin header work?

问题:

Apparently, I have completely misunderstood its semantics. 显然,我完全误解了它的语义。 I thought of something like this: 我想到了这样的事情:

  1. A client downloads javascript code MyCode.js from http://siteA - the origin . 客户端从 http://siteA- origin 下载 javascript 代码 MyCode.js。
  2. The response header of MyCode.js contains Access-Control-Allow-Origin: http://siteB , which I thought meant that MyCode.js was allowed to make cross-origin references to the site B. MyCode.js 的响应标头包含 Access-Control-Allow-Origin:http:// siteB ,我认为这意味着 MyCode.js 被允许对站点 B 进行跨域引用。
  3. The client triggers some functionality of MyCode.js, which in turn make requests to http://siteB, which should be fine, despite being cross-origin requests. 客户端触发了 MyCode.js 的某些功能,该功能继而向 http://siteB 发出了请求,尽管这是跨域请求,但仍然可以。

Well, I am wrong. 好吧,我错了。 It does not work like this at all. 它根本不像这样工作。 So, I have read Cross-origin resource sharing and attempted to read Cross-Origin Resource Sharing in w3c recommendation 因此,我阅读了跨域资源共享,并尝试阅读 w3c 建议中的跨域资源共享

One thing is sure - I still do not understand how am I supposed to use this header. 可以确定的一件事 - 我仍然不明白我应该如何使用此标头。

I have full control of both site A and site B. How do I enable the javascript code downloaded from the site A to access resources on the site B using this header? 我对站点 A 和站点 B 都拥有完全控制权。如何使用此标头使从站点 A 下载的 javascript 代码能够访问站点 B 上的资源?

PS 聚苯乙烯

I do not want to utilize JSONP. 我不想利用 JSONP。


解决方案:

参考一: https://stackoom.com/question/id4F/Access-Control-Allow-Origin 标头如何工作
参考二: https://oldbug.net/q/id4F/How-does-Access-Control-Allow-Origin-header-work

AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误

AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误

我尝试GET在jQuery AJAX请求中发送请求。

$.ajax({    type: ''GET'',    url: /* <the link as string> */,    dataType: ''text/html'',    success: function() { alert("Success"); },    error: function() { alert("Error"); },});

但是,无论我尝试过什么, XMLHttpRequest cannot load <page>. No ''Access-Control-Allow-Origin'' header is present on the requested resource. Origin''http://localhost:7776'' is therefore not allowed access.

我尝试了所有操作,从使用AJAX而不是jQuery 添加header :{}定义到AJAX请求,甚至设置dataType为,甚至下载了一个启用CORS的插件-但没有任何帮助。JSONP``text/plain

如果我尝试访问任何其他站点,也会发生同样的情况。

有任何适当且简单解决方案的想法吗?有没有?

答案1

小编典典

这是设计使然。您不能使用XMLHttpRequest向另一台服务器发出任意HTTP请求,除非该服务器通过为请求主机放置Access-Control-
Allow-Origin标头来允许它。

https://developer.mozilla.org/zh-
CN/docs/Web/HTTP/Access_control_CORS

您可以在script标记中检索它(对脚本,图像和样式表没有相同的限制),但是除非返回的内容是脚本,否则它不会给您带来什么好处。

这是有关CORS的教程:

http://www.bennadel.com/blog/2327-cross-origin-resource-sharing-cors-ajax-
requests-between-jquery-and-node-
js.htm

这样做都是为了保护最终用户。假设一个图像实际上是一个图像,一个样式表只是一个样式表,而一个脚本只是一个脚本,向另一台服务器请求这些资源并不会真正造成任何危害。

但总的来说,跨域请求可能会做的不好。假设您Zoltan正在使用coolsharks.com。还要说您已经登录到mybank.com,并且浏览器中有一个mybank.com的cookie。现在,假设coolsharks.com向mybank.com发送了AJAX请求,要求将您的所有资金转入另一个帐户。因为您存储了mybank.com
cookie,所以他们成功完成了请求。所有这些都是在您不知情的情况下发生的,因为没有页面重新加载发生。这是允许一般跨站点AJAX请求的危险。

如果要执行跨站点请求,则有两个选择:

  1. 获取您向其请求的服务器之一
    。通过放入包含您(或*)的Access-Control-Allow-Origin标头来接纳您
    。b。为您提供JSONP API。

要么

  1. 编写自己的不符合标准且没有限制的浏览器。

在(1)中,您必须与要向其请求的服务器合作,在(2)中,您必须对最终用户的浏览器具有控制权。如果您不能履行(1)或(2),那么您很不幸。

但是,还有第三种选择(由charlietfl指出)。您可以从您控制的服务器发出请求,然后将结果传递回页面。例如

<script>$.ajax({    type: ''GET'',    url: ''/proxyAjax.php?url=http%3A%2F%2Fstackoverflow.com%2F10m'',    dataType: ''text/html'',    success: function() { alert("Success"); },    error: function() { alert("Error"); }});</script>

然后在您的服务器上,最简单的方法是:

<?php// proxyAjax.php// ... validation of params// and checking of url against whitelist would happen here ...// assume that $url now contains "http://stackoverflow.com/10m"echo file_get_contents($url);

当然,此方法可能会遇到其他问题:

  • 您代理的站点是否需要正确的引荐来源网址或特定的IP地址?
  • cookie是否需要传递到目标服务器?
  • 您的白名单是否足以保护您免受随意发出的请求?
  • 当服务器接收到哪些标头(例如,修改时间等)时,您将它们传递回浏览器,而您将省略或更改哪些标头?
  • 您的服务器是否被暗示提出了非法请求(因为您是代理人)?

我敢肯定还有其他人。但是,如果所有这些问题都不能阻止它,那么第三种方法可能会很好地工作。

angularjs – 请求标头字段Access-Control-Allow-Origin在预检响应中不允许使用Access-Control-Allow-Origin

angularjs – 请求标头字段Access-Control-Allow-Origin在预检响应中不允许使用Access-Control-Allow-Origin

当我尝试加载我的网页时出现以下错误:请求标题字段Access-Control-Allow-Origin在预检响应中不允许使用Access-Control-Allow-Origin.

我已经查看了回答此问题的其他答案,并指出缺少CORS支持.令人困惑的是我得到了支持!至少我想我做到了.

我正在尝试将Zingchart连接到我的Angular JS前端并使用AJAX请求从我的REST API获取数据(在localhost:3000)

这是我的AJAX调用:

window.Feed = function(callback) {
    $.ajax({
        type: "GET",dataType: "json",headers: {
            Accept: "application/json","Access-Control-Allow-Origin": "*"
        },url: "http://localhost:3000/readings",success: function (data) {
            var mem = data.mem.size/10000;
            var tick = {
                plot0: parseInt(mem)
            };
            callback(JSON.stringify(tick));
        }
    });

我的REST API实现包括以下内容:

// CORS Support
 app.use(function(req,res,next) {
   res.header('Access-Control-Allow-Origin','*');
   res.header('Access-Control-Allow-Methods','GET,PUT,POST,DELETE');
   res.header('Access-Control-Allow-Headers','Content-Type');
   next();
 });

我的REST API是在本教程的帮助下构建的:https://www.youtube.com/watch?v=OhPFgqHz68o

解决方法

取出“标题”和“dataType”.您的请求将如下所示:

$.ajax({
    type: "GET",success: function (data) {
        var mem = data.mem.size/10000;
        var tick = {
            plot0: parseInt(mem)
        };
        callback(JSON.stringify(tick));
    }
});

您的标题正在触发预检请求.

如果您正在使用Angular,我强烈建议不要使用jQuery for AJAX,而是使用Angular的built-in $http service.

我在ZingChart团队.霍勒,如果我们可以帮助你的图表.

angularjs-$http.post请求标头字段Access-Control-Allow-Headers错误不允许Access-Control-Allow-Origin

angularjs-$http.post请求标头字段Access-Control-Allow-Headers错误不允许Access-Control-Allow-Origin

我正在使用Ionic Framework开发应用程序.

在后端,我为api编写了Flask应用程序,如下所示:

@API.route("/saverez",methods=["POST","OPTIONS"])
@crossdomain(origin='*',headers="*",methods="*")   
@render_api
def saver():
 .....

将json发布到api时出现错误.

var headers = {
                    'Access-Control-Allow-Origin' : '*','Access-Control-Allow-Methods' : 'POST,GET,OPTIONS','Accept': 'application/json'
                };

                $http({
                    method: "POST",headers: headers,url: url+ '/api/saverez',data: $scope.form
                }).success(function (result) 
                    console.log(result);
                }).error(function (data,status,headers,config) {
                    console.log(data);
                    console.log(status);
                    console.log(headers);
                    console.log(config);
                });

所以这给了我错误:

XMLHttpRequest cannot load http://myurl/api/saverez. Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers. 

我用谷歌搜索,然后发现以下代码片段:

http://flask.pocoo.org/snippets/56/

我还将标题添加到我的Nginx conf中,如下所示:

location ~* \.(eot|ttf|woff)${
    add_header Access-Control-Allow-Origin *;
}

尝试了该文档中的所有内容以及我在Google上发现的所有东西,但可惜它没有任何好处.

如何为所有来源设置正确的标题?我也使用google pagespeed是否会导致此问题?

提前致谢.

-编辑-
Chrome网络输出

Remote Address:myip
Request URL:http://myurl/api/saverez
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:access-control-allow-origin,accept,access-control-allow-methods,content-type
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
Host:myurl
Origin:http://192.168.1.46:8100
Pragma:no-cache
Referer:http://192.168.1.46:8100/
User-Agent:Mozilla/5.0 (iPhone; cpu iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML,like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53
Response Headersview source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:*
Access-Control-Allow-Origin:*
Access-Control-Max-Age:21600
Allow:POST,OPTIONS
Content-Length:0
Content-Type:text/html; charset=utf-8
Date:Thu,28 Aug 2014 13:26:11 GMT
Server:Nginx/1.6.0
最佳答案
在我的应用程序模块配置部分,我有以下内容:

angular.module('starterapp',['ionic'])
  .config(function ($stateProvider,$httpProvider,$urlRouterProvider) {

    // We need to setup some parameters for http requests
    // These three lines are all you need for CORS support
    $httpProvider.defaults.useXDomain = true;
    $httpProvider.defaults.withCredentials = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
  }

这就是使所有HTTP请求与CORS一起使用所需要的.当然,这是假设您已经建立了后端.

根据XMLHTTPRequest的w3c规范,您不能添加这些其他标头,因为它们只能由主机浏览器添加.

关于JSONP跨源错误“不存在Access-Control-Allow-Origin标头”org.json不存在的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Access-Control-Allow-Origin 标头如何工作? - How does Access-Control-Allow-Origin header work?、AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误、angularjs – 请求标头字段Access-Control-Allow-Origin在预检响应中不允许使用Access-Control-Allow-Origin、angularjs-$http.post请求标头字段Access-Control-Allow-Headers错误不允许Access-Control-Allow-Origin的相关信息,请在本站寻找。

本文标签: