有预检请求的CORS帖子

时间:2012-11-20 00:18:20

标签: javascript ajax cors

我正在尝试使用CORS将文件上传到不同域上的服务,但由于原因被拒绝,它们会一直失败。据我所知,正在使用正确的标题来实现这一点。

Javascript请求:

  var xhr = new XMLHttpRequest();
  xhr.open('POST', "https://files.example.com", true);                                                                                                                            
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.onreadystatechange = function () {
    if (this.status == 200 && this.readyState == 4) {
      console.log('response: ' + this.responseText);
    }
  };

  xhr.send();

预检OPTIONS请求的响应:

Access-Control-Allow-Headers:Origin, Authorization, Content-Type
Access-Control-Allow-Methods:POST, OPTIONS
Access-Control-Allow-Origin:*
Content-Length:0
Content-Type:application/json
Date:Mon, 19 Nov 2012 23:30:21 GMT

POST请求的标头:

Cache-Control:no-cache
Content-Type:application/json
Origin:https://www.example.com
Pragma:no-cache
Referer:https://www.example.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.19 (KHTML, like     Gecko) Chrome/25.0.1325.0 Safari/537.19

导致错误:

XMLHttpRequest cannot load https://files.example.com. Origin https://www.example.com is not allowed by Access-Control-Allow-Origin.

4 个答案:

答案 0 :(得分:1)

子域名不同。就CORS而言,子域,协议和端口必须在Origin和Access-Control-Allow-Origin中相同。

在您的示例中,原点如下:https://www.example.com Access-Control-Allow-Origin是:https://files.example.com

答案 1 :(得分:1)

不幸的是,POST到域以外的域会引发CORS。这还包括不同的子域,端口和协议(http / https)。

当请求“不简单”时执行预检,这意味着,内容类型标头设置为“text / plain”以外的其他内容。你的“application / json”让浏览器害怕进行预检。

如果这些50-200毫秒对您很重要,那么您可以重写您的Web服务以了解“简单”内容类型。如果没有,那么当你的任务是OPTIONS(http方法)时,你应该让你的web服务返回HTTP状态204(没有内容)。

处理wcf时:

kent$  cat f
A----A----------A----A-A--AAAA-
-CC----CCCC-C-----CCC-C-------C
------G----G--G--G------G------
---TT--------T-T---------T-----

kent$  awk 'NR==1{split($0,a,"");next}
        {delete b;split($0,b,"")
                for(i=1;i<=length(a);i++)if(a[i]=="-") a[i]=b[i]
        }
        END{for(i=1;i<=length(a);i++)printf "%s",a[i];print ""}' f
ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC

答案 2 :(得分:0)

尝试将Cache-Control和Pragma添加到预检中允许的标头列表中。完整标题应如下所示:

Access-Control-Allow-Headers: Cache-Control, Pragma, Origin, Authorization, Content-Type

答案 3 :(得分:0)

现在已经很晚了,但是看一下你的信息,它显示了飞行前的CORS检查工作正常,它只是实际的(第二个)CORS请求,其中响应被浏览器阻止。

遗憾的是,您没有包含对实际(第二个)CORS请求的响应,因为这可能包含响应拒绝的线索。我的怀疑是,尽管飞行前的反应正确地包含标题:

Access-Control-Allow-Origin:*

...您的实际(第二个)响应可能没有包含该标头,在这种情况下,浏览器会正确拒绝响应。如果我的假设是正确的,那么解决方案就是在实际(非飞行前)响应中也包含此标题。