Javascript 带飞行前请求的CORS post

Javascript 带飞行前请求的CORS post,javascript,ajax,cors,Javascript,Ajax,Cors,我正在尝试使用CORS将文件上载到另一个域上的服务,但由于来源被拒绝,这些文件一直失败。据我所知,正使用正确的标题来实现这一点 Javascript请求: var xhr = new XMLHttpRequest(); xhr.open('POST', "https://files.example.com", true);

我正在尝试使用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();
来自飞行前选项请求的响应:

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.

尝试将缓存控制和Pragma添加到飞行前允许的标题列表中。完整标题应如下所示:

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

子域是不同的。就CORS而言,子域、协议和端口在源站和访问控制允许源站中必须相同

在您的示例中,原点看起来是:
访问控制允许的来源是:

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

当请求为“不简单”时,即将内容类型头设置为“文本/普通”以外的内容时,预飞行完成。你的“application/json”让浏览器害怕进入预处理状态

如果这50-200毫秒对您很重要,那么您可以重写web服务以理解“简单”的内容类型。如果不是,那么当您的web服务被赋予选项(HTTP方法)时,您应该让它返回HTTP状态204(无内容)

处理wcf时:

WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NoContent;

虽然有点晚了,但从您的信息来看,飞行前CORS检查工作正常,这只是实际的(第二)CORS请求,浏览器会阻止响应

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

Access-Control-Allow-Origin:*

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

您是否得到了解决方案?我也面临着类似的问题?此请求是否得到认证?如果是这样,访问控制允许源代码需要与源代码匹配(不能使用通配符)。但他使用了访问控制允许源代码:*,它支持所有源代码