将 cookie 设置为永不过期

Posted

技术标签:

【中文标题】将 cookie 设置为永不过期【英文标题】:Set a cookie to never expire 【发布时间】:2011-03-18 10:52:50 【问题描述】:

查看php documentation on setting a cookie 我发现我可以为cookie 设置过期日期。您可以将 cookie 设置为在浏览器会话结束时或将来某个时间过期,但我看不到的方法。这甚至可能吗?这是如何实现的?

【问题讨论】:

@sAc:为什么这是一件坏事? 因为根据 cookie 规范,这是不可能的。不能设置为永不过期。 您可以使用$cookie->setMaxAge(2147483647);,它晚于2080,适用于32位和64位,github.com/delight-im/PHP-Cookie 【参考方案1】:

所有 cookie 都会根据 cookie specification 过期,因此这不是 PHP 限制。

使用遥远的未来日期。比如设置一个十年后过期的cookie:

setcookie(
  "CookieName",
  "CookieValue",
  time() + (10 * 365 * 24 * 60 * 60)
);

请注意,如果您在 32 位 PHP 中设置的日期超过了 2038,则该数字将环绕,您将获得一个立即过期的 cookie。

【讨论】:

请注意,当 2018 年到来时,如果我们不使用 64 位 PHP,这将环绕 32 位整数并以接近零的时间发送到客户端。 (这发生在 PHP 上 25 年的 cookie 中。) 在 2018 年(距离现在仅 5 年)回到这些 cmets 会很有趣,看到每个人都争先恐后地在 20 年后的 2038 年再次实施 Y2018 升级。希望我们都能实现这一目标到那时,对于 64 位的一切,这在 12 月 4 日星期日 292,277,026,596 再过 2920 亿年都不会成为问题。除非我们在我死前达到一个奇点,否则我认为我不必担心那个。 如果一个人在 2037 年底使用的是他们现在使用的同一台计算机……那将是可悲的! 我在 2018 年读到这篇文章,惊慌了片刻,然后意识到我没事。 各位时间旅行者,您好,我从遥远的 2019 年开始与您交谈。我们的星球发生了很大变化。我们正在宇宙中寻找地方来拯救我们的物种。与此同时,我们仍然使用 cookie。【参考方案2】:

最大值:2147483647

setcookie("CookieName", "CookieValue", 2147483647);

为避免整数溢出,时间戳应设置为:

2^31 - 1 = 2147483647 = 2038-01-19 04:14:07

设置较高的值可能会导致旧浏览器出现问题。

另见RFC about cookies:

Max-Age=value
  OPTIONAL.  The value of the Max-Age attribute is delta-seconds,
  the lifetime of the cookie in seconds, a decimal non-negative
  integer.  To handle cached cookies correctly, a client SHOULD
  calculate the age of the cookie according to the age calculation
  rules in the HTTP/1.1 specification [RFC2616].  When the age is
  greater than delta-seconds seconds, the client SHOULD discard the
  cookie.  A value of zero means the cookie SHOULD be discarded
  immediately.

和RFC 2616, 14.6 Age:

如果缓存接收到大于最大正数的值 它可以表示的整数,或者如果它的任何年龄计算 溢出,它必须发送一个值为 2147483648 (2^31).

http://www.faqs.org/rfcs/rfc2616.html

【讨论】:

非常彻底!感谢您提供良好的参考。【参考方案3】:

设置一个遥远的未来绝对时间

setcookie("CookieName", "CookieValue", 2147483647);

最好使用绝对时间而不是按照接受的答案中的建议相对于现在计算它。

兼容32位系统的最大值为:

2147483647 = 2^31 = ~year 2038

【讨论】:

20 亿很容易记住,但 $forever 的理想数字是 2^31 - 1 = 2147483647 对应于 2038 年 1 月。这是避免 2038 错误的整数溢出的最大值@John 说。【参考方案4】:

我的特权阻止我对第一篇文章发表评论,所以它必须放在这里。

从当前日期起提前 20 年设置时,应考虑2038 unix bug,这是上面建议的正确答案。

您在 2018 年 1 月 19 日 +(20 年)的 cookie 很可能会遇到 2038 问题,具体取决于您最终运行的浏览器和/或版本。

【讨论】:

【参考方案5】:

你不能说一个永无止境的循环吗,cookie 过期为当前日期 + 1,所以它永远不会达到它应该过期的日期,因为它总是明天?有点矫枉过正,但只是说。

【讨论】:

其实他说的有道理。只需使用一些合适的“不活动期”,例如 3 个月,然后在每个请求上用该时间段刷新 cookie 确实是有意义的。 @StijndeWitt 或者只有 10 年。如果用户在 10 年内访问,则更新它...【参考方案6】:

虽然这不太可能,但您可以做一些类似于 Google 所做的事情,并将您的 cookie 设置为 2038 年 1 月 17 日或同样遥远的时间。

实际上,您最好将 cookie 设置为 10 年或 60*60*24*365*10,这应该比您的 cookie 可以使用的大多数机器寿命更长。

【讨论】:

这将持续到 2028 年初,届时您将溢出该值并且 cookie 将停止工作。最好使用绝对值。 假设他的代码在 2028 年仍然会在过时的机器上运行......不知何故,我更担心每个人都会忘记更新固定日期......软件往往比硬件更长寿。【参考方案7】:

如果您想在客户端机器上永久保存数据 - 或至少在浏览器缓存完全清空之前,请使用 javascript 本地存储:

https://developer.mozilla.org/en-US/docs/DOM/Storage#localStorage

不要使用会话存储,因为它会像一个最大年龄为零的 cookie 一样被清除。

【讨论】:

在读取服务器端数据时不能考虑 localStorage。【参考方案8】:

Neverforever 是我因为生活的不可预测性而避免使用的两个词。

1 January 1970 以来,可以使用带符号的32-bit 整数存储的最晚时间是03:14:07 on Tuesday, 19 January 2038231-1 = 2,147,483,6471 January 1970 之后的秒数)。此限制称为Year 2038 problem

setCookie("name", "value", strtotime("2038-01-19 03:14:07"));

【讨论】:

【参考方案9】:

我相信没有办法让 cookie 永远存在,但您只需将其设置为在很长一段时间内过期,例如 2100 年。

【讨论】:

【参考方案10】:

你不应该那样做,无论如何这是不可能的,如果你愿意,你可以设置一个更大的值,比如提前 10 年。

顺便说一句,我从来没有见过有这种要求的cookie :)

【讨论】:

我会假设 cookie 用于唯一回答的民意调查,不想过多打扰防止多个条目有此要求。 看看@sarfraz,它是电脑 cookie,而不是你吃的那些。【参考方案11】:

你可以设置一个远离日期的日期,cookie是这样创建的:

var Cookie_expiry = new Date();
Cookie_expiry.setDate(Cookie_expiry.getDate()+10e5);   
// expiry date of cookie is set to be practically infinite (~ 4000 years)
setCookie('token', 'token_value', expires: Cookie_expiry);

【讨论】:

【参考方案12】:

我不确定,但浏览器关闭时不会删除 cookie 吗?我不知何故做了一个永不过期的cookie,chrome将过期日期识别为“在浏览器关闭时”......

【讨论】:

不一定,如果您在cookie上设置了过期日期,则在您关闭浏览器并重新打开它后它会继续存在。如果您不设置过期时间,则默认行为将在您关闭浏览器时被删除。【参考方案13】:

如果您将过期时间设置为现在 + 100 年,您不能这样做?

【讨论】:

否,因为这将超过 2038 年 1 月的最大值。

以上是关于将 cookie 设置为永不过期的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置session永不过期

cookie.setMaxAge();如何设置这个cookie永不过期?

如何在 django 中设置会话永不过期

没有过期日期的 Javascript Cookie

Powershell 将用户帐户密码设置为永不过期

Nodejs jwt 令牌永不过期