Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过AJAX实现跨源资源共享(CORS)_Javascript_Jquery_Ajax_Cors - Fatal编程技术网

Javascript 通过AJAX实现跨源资源共享(CORS)

Javascript 通过AJAX实现跨源资源共享(CORS),javascript,jquery,ajax,cors,Javascript,Jquery,Ajax,Cors,我知道在这个话题上有很多问题,我一直在努力解决这个问题。请允许我谈一谈这件事 我的目标: 我正在尝试从以下URL获取JSON数据: 我正在使用以下AJAX请求: $.ajax({ url: "https://www.icims.com/bellworks", success: function(res){ console.log(res); } }); 我的问题: 我得到以下错误: 已阻止跨源请求:同一源策略不允许读取 位于的远程资源。(理由:C

我知道在这个话题上有很多问题,我一直在努力解决这个问题。请允许我谈一谈这件事

我的目标:

我正在尝试从以下URL获取JSON数据:

我正在使用以下AJAX请求:

$.ajax({

    url: "https://www.icims.com/bellworks", 

    success: function(res){
        console.log(res);
    }
});
我的问题:

我得到以下错误:

已阻止跨源请求:同一源策略不允许读取 位于的远程资源。(理由:CORS 飞行前通道未成功)

尽管直接访问URL会在标题中显示以下内容:

Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *
我已经下载了Firefox和Chrome扩展,支持CORS,这很有效!我能得到数据

我的问题:

这些CORS插件做了什么,我没有

显然,这是我需要添加到源客户端的东西,对吗?也就是说,我需要根据AJAX请求对我进行更改。我不需要对响应服务器进行任何更改

我需要在请求中添加什么来更正此问题?

“原因:CORS飞行前频道未成功”

从错误消息中可以看出,ajax调用生成了一个“选项”请求,该请求被cors阻止。(访问控制允许方法)


选中此项,可能会有所帮助:

服务器响应还应包括以下标题:“访问控制允许方法”。其值可以是“POST、GET、OPTIONS”,以允许飞行前请求。见医生

我得到以下错误:

已阻止跨源请求:同一源策略不允许读取 位于的远程资源。(理由:CORS 飞行前通道未成功)

尽管直接访问URL会产生以下结果 在标题中:

Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *
你在哪里看到的?在来自
https://www.icims.com/bellworks
-不在浏览器开发工具中,例如,
curl

$curl-i-H”原点:http://example.com" https://www.icims.com/bellworks
HTTP/1.1200ok
年龄:141
缓存控制:公共,最大使用年限=1800
内容类型:application/javascript;字符集=utf-8
日期:2017年5月9日星期二10:17:38 GMT
Etag:“1494323930-1”
过期时间:1978年11月19日星期日格林尼治标准时间05:00:00
最后修改:2017年5月9日星期二09:58:50 GMT
服务器:nginx
更改:Cookie,接受编码
通孔:1.1清漆
X-AH-Environment:prod
X缓存:命中
X缓存命中率:2
X-Content-Type-Options:nosniff
X-Drupal-Cache:命中
X-Request-ID:v-66496654-34a0-11e7-ba07-22000a2c8dd2
X-清漆:2264707046 2264675783
内容长度:6443
连接:保持活力
在类似这样的简单情况下,如果1)您在前端JS代码中不控制要从中获取数据的服务器,2)该服务器在其响应中不发送
Access control Allow Origin
,则您可以更改前端代码,改为通过开放的CORS代理发出请求:

$.ajax({    
    url: "https://cors-anywhere.herokuapp.com/https://www.icims.com/bellworks",
    …
});
这将导致向
https://cors-anywhere.herokuapp.com
,然后将其发送到
https://www.icims.com/bellworks
。当代理收到响应时,它将接收该响应并向其添加
Access Control Allow Origin
响应头,然后将其作为响应传递回请求的前端代码

浏览器看到的是带有
访问控制允许源代码
响应头的响应,因此浏览器引擎显示的错误消息现在消失,浏览器允许前端JavaScript代码访问响应

或者使用来自或类似的代码来设置您自己的代理

这些CORS插件在做什么,我没有

不同的是,它们没有被浏览器阻止。插件可以做任何他们想做的事情,包括绕过浏览器在web应用程序中对前端JavaScript代码施加的跨源限制,浏览器从中执行代码

浏览器devtools也不受跨源限制的影响如果您使用devtools检查您收到的请求,您会注意到实际上可以在devtools中看到响应。但这并不意味着浏览器一定会向前端JavaScript代码公开响应。如果响应包含
access Control Allow Origin
标题,则浏览器仅允许前端JavaScript代码访问它

显然,这是我需要添加到源客户端的东西,对吗

不可以。如果前端JS代码发出跨源请求,并且响应不包含
访问控制允许源
标题,那么您的浏览器将阻止您的代码访问响应,客户端不会对此进行任何更改。句号

也就是说,我需要根据AJAX请求对我进行更改

不,基于上述原因

我不需要对响应服务器进行任何更改

您确实需要更改响应服务器以发送
Access Control Allow Origin
标题。或者如上所述,您需要通过一个代理发送请求,该代理将把
访问控制允许来源
头添加到浏览器看到的响应中

我需要在请求中添加什么来更正此问题


如果您不控制向其发出请求的服务器,实际上,您唯一的选择是更改代码,改为通过代理发出请求,该代理添加
访问控制允许来源

请参见此处:您尝试过此操作吗?标题放在GET请求上,但没有选项飞行前请求。来自该url的响应看起来更像
jsonp
——它在json周围有一个方法调用<代码>钟楼({。。。