Chrome上的CORS错误但在IE中有效

时间:2017-07-05 05:34:40

标签: ajax google-chrome cors sharepoint-online jira-rest-api

我创建了一个表单,可以让用户从html表单中提取JIRA票证。我已经要求管理员将原点(sharepoint在线站点,表单托管)添加到JIRA的白名单中,作为格式为https://xxxx.sharepoint.com/ *的通配表达式。

它现在可以在IE中运行,但我仍然在chroe中出错:

  

jquery-3.1.0.min.js:4 XMLHttpRequest无法加载   https://jira.xxx.xx/rest/api/2/issue/。对预检请求的响应   没有通过访问控制检查:没有'Access-Control-Allow-Origin'   标头出现在请求的资源上。起源   因此,“https://xxxx.sharepoint.com”不允许访问。该   响应有HTTP状态代码403。

在Edge中

我收到此错误:

  

HTTP403:FORBIDDEN - 服务器理解请求,但是   拒绝履行它。

我注意到的一件事是,当我在IE上运行它,点击提交后。我看到一个弹出屏幕登录我的JIRA凭证。这不会发生在Chrome或Edge上。能告诉我这里我想念的是什么吗?

这是我的ajax电话:

return $.ajax({
    url: 'https://jira.xxxx.com/rest/api/2/issue/',
    type: "POST",
    data: parameters,
    contentType: 'application/json',
    dataType: 'JSON',
    async: false,
    processData: false,
    beforeSend: function (xhr) {
        xhr.setRequestHeader('Authorization', 'basic: '+make_base_auth(username, password));
        xhr.setRequestHeader( 'Access-Control-Allow-Origin', 'https://jira.xxxx.com');
        xhr.setRequestHeader( 'X-Atlassian-Token', 'nocheck');
        xhr.setRequestHeader( 'Access-Control-Allow-Credentials', 'true');
        xhr.setRequestHeader( 'Access-Control-Allow-Methods', 'ACL, CANCELUPLOAD, CHECKIN, CHECKOUT, COPY, DELETE, GET, HEAD, LOCK, MKCALENDAR, MKCOL, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, SEARCH, UNCHECKOUT, UNLOCK, UPDATE, VERSION-CONTROL');
        xhr.setRequestHeader( 'Access-Control-Allow-Headers', 'Overwrite, Destination, Content-Type, Depth, User-Agent, Translate, Range, Content-Range, Timeout, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Location, Lock-Token, If');
        xhr.setRequestHeader( 'Access-Control-Expose-Headers', 'DAV, content-length, Allow');
    },
    error: function (errmsg) {
        console.log('error ocured:' + errmsg.statusText);
    },
    success: function (text) {
        console.log(text);
    },
});

1 个答案:

答案 0 :(得分:3)

您要添加的所有Access-Control标头都是响应标头。在请求中发送它们是没有意义的。 CORS确实有几个请求标头,但它们是由浏览器发送的。您的请求不应发送给他们。如果为跨源请求正确配置了服务器,它将在适当的时候设置这些标头。

Chrome告诉您CORS预检请求没有Access-Control-Allow-Origin标头。预检请求是一个OPTIONS请求,发送该请求以询问服务器是否允许发出请求。如果服务器发回正确的标头(目前不是),则浏览器知道它可以发出实际的POST请求。你没有超过预检请求。

您对跨源透视图的请求没有任何问题(除了已经提到的无关头文件)。假设其他一切都是正确的,问题出在运行API的服务器上。控制该服务器的任何人都需要对其进行配置以正确响应CORS预检请求。

我最好的猜测是API配置为响应实际请求,但不响应预检请求。并且,我猜测IE错误地将请求视为“简单请求”,不需要预检请求。这可以解释为什么它适用于IE,但不适用于Chrome。但是,我只能在没有更多信息的情况下猜测。