我一定是忽略了饼干的一些基本特性。在localhost上,当我在服务器端设置cookie并显式地将域指定为localhost(或.localhost)时。有些浏览器似乎不接受cookie。

Firefox 3.5:我在Firebug中检查了HTTP请求。我看到的是:

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

或者(当我设置域为.localhost时):

Set-Cookie:
    name=value;
    domain=.localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

在这两种情况下,cookie都不会被存储。

IE8:我没有使用任何额外的工具,但cookie似乎没有被存储,因为它没有在后续的请求中被发送回来。

Opera 9.64: localhost和.localhost都可以工作,但是当我检查Preferences中的cookie列表时,域被设置为localhost。Local,即使它列在localhost下(在列表分组中)。

Safari 4: localhost和.localhost都可以工作,但它们总是在首选项中列出为.localhost。另一方面,一个没有显式域的cookie,它只显示为localhost(没有点)。

localhost有什么问题?由于存在如此多的不一致,必须有一些涉及localhost的特殊规则。另外,我也不完全清楚为什么域名必须以一个点作为前缀?RFC 2109明确指出:

Domain属性的值 不包含或不包含嵌入点 从一个点开始。

为什么?该文档表明它必须在安全性方面做一些事情。我必须承认我没有阅读完整的规范(可能以后会读),但它听起来有点奇怪。基于此,在本地主机上设置cookie是不可能的。


当前回答

Cookie需要指定SameSite属性,None值曾经是默认值,但最近的浏览器版本将Lax作为默认值,以对某些类型的跨站请求伪造(CSRF)攻击具有相当强大的防御能力。

除了SameSite=Lax,你还应该有Domain=localhost,这样你的cookie就会关联到localhost并被保存。它应该看起来像这样:

document.cookie = `${name}=${value}${expires}; Path=/; Domain=localhost; SameSite=Lax`;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

其他回答

所有建议的修复程序都不适合我——设置为null、false、添加两个点等等——都不起作用。

最后,我只是从cookie中删除了域,如果它是localhost,现在在Chrome 38中为我工作。

以前的代码(不工作):

document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';

新代码(现在工作):

 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }

唯一对我有用的是在cookie上设置Path=/。

此外,路径属性的默认值似乎因浏览器而异,尽管我只测试了其中两种(Firefox和Chrome)。

Chrome试图设置cookie是;如果路径属性在Set-Cookie头中被省略,那么它将不会被存储和忽略。

然而,Firefox即使没有显式的路径属性也可以存储cookie。它只是用请求的路径设置它;我的请求url是/api/v1/users,路径被自动设置为/api/v1。

不管怎样,当path被设置为/时,即使没有显式的域,即domain =localhost或其他东西,这两个浏览器都可以工作。因此,每种浏览器处理cookie的方式都有所不同。

如果有人仍然面临这个问题,我发现从post请求切换到get请求是必要的。

我使用axios,并在前端使用凭据:true,但这是失败的。切换请求到get并更改后端以匹配工作。

按照设计,域名必须至少有两个点;否则浏览器将认为它们无效。(详见http://curl.haxx.se/rfc/cookie_spec.html)

在localhost上工作时,必须完全省略cookie域。你不应该将它设置为""或NULL或FALSE而不是"localhost"。这还不够。

对于PHP,请参阅http://php.net/manual/en/function.setcookie.php#73107上的评论。

如果使用Java Servlet API,完全不要调用cookie.setDomain("…")方法。

我也有同样的问题,我通过在cookie名称本身放置2个点而不指定任何域来修复它。

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly