我正在尝试从不同域上的Web服务获取一些数据,而且我遇到了一些CORS问题。
我的控制器里有这样的东西:
$http({method: 'GET', url : 'http://somewebserviceapi.com?idAppli=' + appId, headers: {'Authorization': 'Basic dXNlcm5hbWU6cGFzc3dvcmQ='}}).
success(function(data, status, headers, config) {
console.log(data);
}).
error(function() {
console.log("An error occured");
});
我收到以下错误:
选项http://somewebserviceapi.com?idLangue=1&idAppli=2153 b @ angular.js:9866n @ angular.js:9667 $ get.f @ angular.js:9383(匿名函数)@ angular.js:13248 $ get.n. $ eval @ angular.js:14466 $ get.n. $ digest @ angular.js:14282 $ get.n. $ apply @ angular.js:14571showApplication @ viewerController.js:825handleApplications @svgManipulation.js:15SvgPanZoom.handleMouseUp @svg-pan- zoom.js:1195SvgPanZoom.setupHandlers.eventListeners.mouseup @svg-pan-zoom.js:829
和
XMLHttpRequest无法加载http://somewebserviceapi.com?idLangue=1&idAppli=2153。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://localhost:63342”访问。响应的HTTP状态代码为401。
现在标题:
从我的控制器调用时:(似乎没有进行身份验证)
(响应)
Connection: Keep-Alive
Content-Length: 0
Date: Mon, 29 Jun 2015 14:33:09 GMT
Keep-Alive: timeout=5, max=100
Server: Apache
WWW-Authenticate: Negotiate
Basic realm="AD-ITS.SOME-COMPANY.COM"
(请求)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Access-Control-Request-Headers: authorization
Access-Control-Request-Methods: GET
Connection: keep-alive
Host: somewebserviceapi.com
Origin: http://localhost:63342
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
当我自己去网址时:
(响应)
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Origin, Accept, Authorization
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Length: 394
Content-Type: application/json;charset=UTF-8
Date: Mon, 29 Jun 2015 15:21:08 GMT
Keep-Alive: timeout=5, max=99
Server: Apache
(请求)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Connection: keep-alive
Cookie: JSESSIONID=89C1EC542BCBC42421C6207767EF8FA1
Host: http://somewebserviceapi.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
在Chrome上,除响应和请求标头外,还有一个通用标头可见: 在这个标题中,我有:
来自我的控制器请求:Request Method:OPTIONS
当我自己去网址时:Request Method:GET
显然,OPTIONS
方法是CORS处理某些事情的方式,但我是否需要在某处添加OPTIONS方法?
服务器端,我确实有Access-Control-Allow-Origin: *
行,所以我不知道如何解决这个问题。
答案 0 :(得分:0)
这是典型的CORS问题,当你从JS调用并且应用了CORS逻辑时,第一次调用将是OPTIONS
应返回
200 OK
(不确定它是否真的必须为空)
和标题:
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Access-Control-Allow-Origin: *
正确配置OPTIONS
后,如果可以在Access-Control-Allow-Methods: GET, POST, DELETE, PUT
虽然必须将OPTIONS
添加到Access-Control-Allow-Methods
答案 1 :(得分:0)
这似乎与预检请求(OPTIONS请求)有关。请看一下这个问题Why does the preflight OPTIONS request of an authenticated CORS request work in Chrome but not Firefox?:
如何让OPTIONS请求一致地发送和响应?
只需让服务器(本例中为API)响应OPTIONS即可 请求而不需要身份验证。
Kinvey在扩展这个问题上做得很好,同时也解决了一个问题 Twitter API概述了这个问题的第22个问题 有趣的是,在任何浏览器问题出现前几周 被提起。
看看它是否适合你。 (另外,由于这似乎也是与浏览器相关的问题,请查看不同的浏览器,看看会发生什么)