Ajax 在Chrome上出现CORS错误,但在IE中有效

Ajax 在Chrome上出现CORS错误,但在IE中有效,ajax,google-chrome,cors,sharepoint-online,jira-rest-api,Ajax,Google Chrome,Cors,Sharepoint Online,Jira Rest Api,我创建了一个表单,允许用户从html表单中获取JIRA票证。我已经要求管理员将源代码(sharepoint online site,表单托管)添加到JIRA的白名单中,作为格式为*的wildard表达式 它现在在IE中工作,但在chroe中仍然会出现错误: jquery-3.1.0.min.js:4 XMLHttpRequest无法加载 . 对飞行前请求的响应 未通过访问控制检查:无“访问控制允许来源” 请求的资源上存在标头。起源 因此不允许访问“”。这个 响应的HTTP状态代码为403 在Ed

我创建了一个表单,允许用户从html表单中获取JIRA票证。我已经要求管理员将源代码(sharepoint online site,表单托管)添加到JIRA的白名单中,作为格式为*的wildard表达式

它现在在IE中工作,但在chroe中仍然会出现错误:

jquery-3.1.0.min.js:4 XMLHttpRequest无法加载 . 对飞行前请求的响应 未通过访问控制检查:无“访问控制允许来源” 请求的资源上存在标头。起源 因此不允许访问“”。这个 响应的HTTP状态代码为403

在Edge中,我得到以下错误:

HTTP403:禁止-服务器已理解请求,但已被禁用 拒绝履行它

我注意到的一件事是,当我在IE上运行它时,在单击submit之后。我会看到一个弹出屏幕来登录我的JIRA凭证。这不会发生在铬合金或边缘上。你能让我知道我错过了什么吗

这是我的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);
    },
});

您要添加的所有访问控制标头都是响应标头。在请求中发送它们是没有意义的。CORS确实有几个请求头,但它们是通过浏览器发送的。你的请求不应该发送它们。如果服务器正确配置了跨源请求,它将在返回的响应中适当地设置这些头

Chrome告诉您,CORS飞行前请求没有
访问控制允许原点
标题。飞行前请求是一个选项请求,用于询问服务器是否允许其发出请求。如果服务器发回正确的标题(目前不是),那么浏览器知道它可以发出实际的POST请求。你没有通过飞行前的请求

您对跨源透视图的请求没有任何问题(除了已经提到的无关头)。假设其他一切都是正确的,问题在于运行API的服务器。无论谁控制该服务器,都需要将其配置为正确响应CORS飞行前请求


我的最佳猜测是,API配置为响应实际请求,而不是飞行前请求。而且,我猜IE错误地将请求视为“简单请求”,而不需要飞行前请求。这可以解释为什么它可以在IE中工作,但不能在Chrome中工作。但是,没有更多信息,我只能猜测。

您添加的所有访问控制头都是响应头。在请求中发送它们是没有意义的。CORS确实有几个请求头,但它们是通过浏览器发送的。你的请求不应该发送它们。如果服务器正确配置了跨源请求,它将在返回的响应中适当地设置这些头

Chrome告诉您,CORS飞行前请求没有
访问控制允许原点
标题。飞行前请求是一个选项请求,用于询问服务器是否允许其发出请求。如果服务器发回正确的标题(目前不是),那么浏览器知道它可以发出实际的POST请求。你没有通过飞行前的请求

您对跨源透视图的请求没有任何问题(除了已经提到的无关头)。假设其他一切都是正确的,问题在于运行API的服务器。无论谁控制该服务器,都需要将其配置为正确响应CORS飞行前请求


我的最佳猜测是,API配置为响应实际请求,而不是飞行前请求。而且,我猜IE错误地将请求视为“简单请求”,而不需要飞行前请求。这可以解释为什么它可以在IE中工作,但不能在Chrome中工作。但是,没有更多的信息,我只能猜测。

Hi@Jason,您知道在服务器中配置什么吗?因为这是一个JIRA应用程序,我不确定要更改哪些配置,我必须查看我是否拥有必要的权限。谢谢你的回答我从来没有使用过JIRA API,所以我不知道它的配置选项。我甚至不知道是否有允许这样做的配置选项。我可以告诉您,它必须使用标题
访问控制允许来源
访问控制允许方法
访问控制允许标题
响应选项请求。您好@Jason,您知道在服务器中配置什么吗?因为这是一个JIRA应用程序,我不确定要更改哪些配置,我必须查看我是否拥有必要的权限。谢谢你的回答我从来没有使用过JIRA API,所以我不知道它的配置选项。我甚至不知道是否有允许这样做的配置选项。我可以告诉您,它必须使用标题
Access Control Allow Origin
Access Control Allow Methods
Access Control Allow headers
响应选项请求。