【问题标题】:CORS cookie not sent in ChromeCORS cookie 未在 Chrome 中发送
【发布时间】:2014-08-02 03:58:35
【问题描述】:

我已经使用 jQuery 对不同域的 ajax 调用设置了一个简单的文件上传表单。浏览器有一个域的 cookie,这个 cookie 在 Firefox 中随请求一起发送。但是,cookie 不存在于 Chrome 中,导致无法登录。 我已经验证了 cookie 确实存在于 Chrome 中,只是没有随请求一起发送。

ajax 调用: 其中一些可能不是必需的。添加了尝试相关的解决方案并留下来演示这些尝试。

<head>
    <script src="jquery-2.1.1.min.js"></script>
</head>

<form enctype="multipart/form-data" id="file" method="POST">
    <input name="file" type="file" />
    <input name="Submit" type="button" id="upload"/>
</form>

<script type="text/javascript">
    $.support.cors = true

    $('input#upload').click(function(){
        var formData = new FormData($('form#file')[0]);

        .ajax({
            url: 'http://accounts.mysite.dev/file/saveasset',
            type: 'POST',
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            xhrFields: {
                withCredentials: true
            },
            crossDomain: true
        });
    });
</script>

Firefox 发送正确的标头,包括用户的 cookie

POST /file/saveasset HTTP/1.1
Host: accounts.mysite.dev
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://phptest/htmltest/fileUpload.html
Content-Length: 8032
Content-Type: multipart/form-data; boundary=---------------------------4450073521062221055385143281
Origin: http://phptest
Cookie: Accounts=somecookiestuff
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

但 Chrome 没有

POST /file/saveasset HTTP/1.1
Host: accounts.mysite.dev
Content-Length: 7981
Accept: */*
Origin: http://phptest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGyMYxvKgEKWfBR5x
Referer: http://phptest/htmltest/fileUpload.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

我相信服务器设置正确以允许此来源和凭据,但它们甚至没有在 Chrome 的请求中发送。如果相关,我的服务器(带 Zend 的 php)设置

$this->_response->setHeader('Access-Control-Allow-Origin', 'http://phptest');
$this->_response->setHeader('Access-Control-Allow-Credentials', 'true');

我在服务器上没有看到任何 OPTION 预检请求。

为什么 Chrome 不发送我的 cookie?

【问题讨论】:

  • 您希望在 FF 中设置的 Chrome 中看到什么 cookie?两个请求都有一个Origin 标头。

标签: jquery google-chrome cors


【解决方案1】:

检查 Chrome 是否设置为阻止 3rd 方 cookie:

菜单 → 设置 → 显示高级设置... → 隐私:内容设置

确保未选中“阻止第三方 Cookie 和网站数据”。或者,如果您有其他阻止 3rd 方 cookie 的东西,也将其禁用。

在执行跨站点 JSONP 请求时遇到同样的问题,cookie 不会在跨域的任何标记请求上发送。

【讨论】:

  • 太棒了!我不认为这是默认设置,所以我一定在某个时候更改了它。
  • 除了更改设置还有其他方法吗?
  • 这只是咬了我们的一个开发人员并花费了我们一些时间。谢谢你。
猜你喜欢
  • 2016-08-03
  • 2023-04-09
  • 2021-05-29
  • 2018-01-05
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
相关资源
最近更新 更多