继续获取No' Access-Control-Allow-Origin' XMLHttpRequest出错

时间:2014-08-14 19:45:59

标签: javascript xmlhttprequest cors response

我会通过使用jQuery $.ajax函数解决这个问题,但在这种情况下jQuery不是选项。相反,我将使用CORS请求。我觉得响应请求的网络服务器出了问题,我很难搞清楚问题所在。

这是我创建CORS请求的代码

var httpRequest = new XMLHttpRequest();
httpRequest.open('POST', url, true);
httpRequest.setRequestHeader( 'Access-Control-Allow-Origin', '*');
httpRequest.setRequestHeader( 'Content-Type', 'application/json' );
httpRequest.onerror = function(XMLHttpRequest, textStatus, errorThrown) {
  console.log( 'The data failed to load :(' );
  console.log(JSON.stringify(XMLHttpRequest));
};
httpRequest.onload = function() {
  console.log('SUCCESS!');
}

这是console.log错误:

  

XMLHttpRequest无法加载   http://test.testhost.com/testpage。请求标头字段   不允许使用Access-Control-Allow-Origin   接入控制允许集管。

以下是标题信息:

> Remote Address:**.**.***.**:80 Request
> URL:http://test.testdomain.com/testpage Request
> Request Method:OPTIONS
> Status Code:200 OK

请求标题:

OPTIONS /content-network HTTP/1.1
Host: test.testhost.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Access-Control-Request-Method: POST
Origin: http://test.testdomain.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Access-Control-Request-Headers: access-control-allow-origin, content-type
Accept: */*
Referer: http://test.testdomain.com/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

响应标题:

HTTP/1.1 200 OK
Date: Thu, 14 Aug 2014 20:17:25 GMT
Server: Apache
Last-Modified: Thu, 14 Aug 2014 20:17:25 +0000
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1408047445"
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Vary: Accept-Encoding
Content-Encoding: gzip
Access-Control-Allow-Headers: origin, x-requested-with, content-type
Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS
Content-Length: 6117
Connection: close
Content-Type: text/html; charset=utf-8

5 个答案:

答案 0 :(得分:13)

您服务器的回复允许请求包含三个特定的non-simple headers

Access-Control-Allow-Headers:origin, x-requested-with, content-type

但是您的请求的服务器响应不允许使用标头:

Access-Control-Request-Headers:access-control-allow-origin, content-type

Access-Control-Allow-Headers响应标头必须明确允许在CORS请求中发送的所有非简单标头。服务器的CORS响应不允许在您的请求中发送不必要的Access-Control-Allow-Origin标头。这正是Access-Control-Allow-Headers "" ...不允许的内容。错误消息试图告诉你。

请求没有理由拥有此标头:它不执行任何操作,因为Access-Control-Allow-Origin响应标头,而不是请求标头。

解决方案:移除setRequestHeader来电,为您的请求添加Access-Control-Allow-Origin标题。

答案 1 :(得分:3)

卸下:

httpRequest.setRequestHeader( 'Access-Control-Allow-Origin', '*');

...并添加:

httpRequest.withCredentials = false;

答案 2 :(得分:0)

除了您的CORS问题,您尝试访问的服务器已启用HTTP basic authentication。您可以通过在传递给XHR的URL中指定凭据来在跨域请求中包含凭据:

url = 'http://username:password@test.testhost.com/testpage'

答案 3 :(得分:0)

在后端服务器上启用CORS 要么 添加chrome扩展名 https://chrome.google.com/webstore/search/CORS?utm_source=chrome-ntp-icon并启用

答案 4 :(得分:0)

我们通过OAuth2集成看到了很多。我们向客户提供API服务,他们会天真地尝试将其私钥放入AJAX调用中。 这确实是很差的安全性。编码良好的API网关,前端后端以及其他此类代理均不允许这样做。您应该出现此错误。

我将引用@aspillers注释并更改一个单词:“ Access-Control-Allow-Origin服务器响应中发送的标头,它指示 IF 允许客户端以查看结果的内容”。

问题:问题是开发人员试图将其私钥包含在客户端(浏览器)JavaScript请求中。他们会得到一个错误,这是因为他们正在暴露其客户机密。

解决方案:让JavaScript Web应用程序与可安全保护客户端秘密的后端服务进行通信。该后端服务可以向OAuth2提供程序验证Web应用程序,并获取访问令牌。然后,Web应用程序可以进行AJAX调用。