Chrome 允许 ajax 访问 http 外部来源,而 firefox 不允许 - 为啥?

Posted

技术标签:

【中文标题】Chrome 允许 ajax 访问 http 外部来源,而 firefox 不允许 - 为啥?【英文标题】:Chrome allows ajax going to http foreign origin where firefox does not - why?Chrome 允许 ajax 访问 http 外部来源,而 firefox 不允许 - 为什么? 【发布时间】:2020-06-02 20:05:27 【问题描述】:

我有一个带有 javascript 代码的 JSP,在带有 HTTPS 的服务器上运行。在这个 JavaScript 中,我触发了对 另一个(本地)网络服务器的请求,如下所示:

let url = 'http:/localhost:3111/doSomePost';
      $.ajax(
        type: 'POST',
        url: url,
        contentType: 'application/octet-stream',
        processData: false,
        data: uint8array
    )

这需要在本地网络服务器上启用 CrossOrigin 才能工作 - 我配置了该部分并且它可以工作。

但它只适用于 Chrome。不在 Firefox 中。

Firefox 会给我这个错误:

跨域请求被阻止:同源策略不允许读取 远程资源在 http://localhost:3111/doSomePost。 (原因:CORS 请求未成功)。

我可以在 firefox devtools 的网络选项卡中看到,firefox 甚至不费心发送预检请求(OPTIONS 请求)。所以 Firefox 只是决定它不会发送该请求(我怀疑这是因为本地网络服务器协议是 HTTP)。

我现在已将本地网络服务器更改为使用自签名证书的 HTTPS,如下所述:https://www.baeldung.com/spring-boot-https-self-signed-certificate

现在,它可以在 Firefox 和 Chrome 中使用(在我手动添加无效的证书之后)。

我只是想知道为什么 chrome 没有问题,而 firefox 却有。

更新:更正了错误消息中的小错误

【问题讨论】:

【参考方案1】:

我设法找到了更好的解决方案。我没有将本地网络服务器切换到 HTTPS 以使 firefox 正常工作,而是将上述请求更改为:

let url = 'http:/localhost:3111/doSomePost';
      $.ajax(
        type: 'POST',
        url: url,
        data: jsonWithBase64encodedData
    )

这现在再次符合所谓的“简单请求”(https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) 的条件,并且在所有浏览器中都以类似的方式处理,最重要的是,它的工作方式。

【讨论】:

以上是关于Chrome 允许 ajax 访问 http 外部来源,而 firefox 不允许 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

让Chrome支持Ajax/$http方式读取本地文件

AJAX、CORS、Chrome 和 HTTP 错误代码 (401,403,404,500) 的推荐解决方案

chrome浏览器设置允许http访问摄像头麦克风等

Chrome不允许HTTP托管网站访问相机和麦克风

Chrome 中的访问控制允许来源错误

Chrome浏览器开启Ajax跨域访问调试