【问题标题】:Cookie set via JS to expire when the browser closes isn't expiring通过 JS 设置为在浏览器关闭时过期的 Cookie 不会过期
【发布时间】:2016-07-07 07:53:34
【问题描述】:

在 Firefox 和 Safari 中进行测试,我尝试了以下两行。每个都设置 cookie,但在我关闭(然后重新打开)浏览器后,这两种方法都不会使 cookie 过期。 浏览器的 cookie 信息说“测试”设置为过期,“会话结束”,但它没有发生。

有一些类似的帖子(例如,When does a cookie with expiration time 'At end of session' expire?),但没有任何帮助或关于通过 JavaScript 设置 cookie,就像我正在做的那样。

// fails to expire after browser closing
document.cookie = "test=1; expires=0; path=/";

// fails to expire after browser closing
document.cookie = "test=1; path=/";

【问题讨论】:

  • 这很有趣。这可能是由于某些内容安全设置,例如,cookie 最初设置在服务器响应标头中,并且设置了“httpOnly”标志。您的服务器是否发送 set-cookie 标头?
  • @lxe 事实证明这很愚蠢。我没有意识到,当您在 Mac 上“关闭”浏览器时,仍然有一个浏览器进程保持活动状态。您必须明确退出浏览器。一旦我这样做了,cookie就消失了。
  • 如果在浏览器设置中选择了“从上次中断的地方继续”选项,Chrome 会话中的 cookie 可能不会被删除。

标签: javascript session cookies


【解决方案1】:

expires 标签想要获取一个 UTC-Datestring。你可以使用我写的一些简单的函数:

setCookie = function(attrib, value, exp_days) {
  var dt = new Date();
  dt.setTime(dt.getTime() + (exp_days*86400000)); // Convert days to ms
  document.cookie = attrib + "=" + value + "; expires=" + dt.toUTCString(); // add attrib=value to the cookie and set an expiration date
}

getCookie = function(attrib){
  var split_cookie = document.cookie.split("; ");
  attrib+="=";
  for(var i=0; i<split_cookie.length; i++)
    if(~split_cookie[i].indexOf(attrib)) // if the attribute is somewhere in the cookie string
    // im using an ugly bitflip operator here, it could as well be an if(...!=-1)
      return split_cookie[i].substring(attrib.length + split_cookie[i].indexOf(attrib),split_cookie[i].length);
  return "";
}

removeCookie = function(attrib){
  setCookie(attrib, "", -1);
}

如果使用removeCookie()函数,在离开当前页面时attrib的值会被删除。

【讨论】:

  • 谢谢。可悲的是同样的结果。如果我希望它在浏览器关闭时过期,究竟应该将 exp_days 设置为什么?我试过 0、1、-1 并将其留空。至于 removeCookie 功能,我不想显式删除任何东西。浏览器不应该自动关闭我的“删除”吗?一件事 - 我现在确实看到,即使在我关闭浏览器之后,它们仍然会留下一个进程运行。只有在我终止该进程后,我才发现 cookie 终于过期了。所以,问题是 - 是否存在导致会话/进程持续存在的浏览器设置?
  • 更新:打开的进程是因为我在 Mac 上,所以在我关闭浏览器后它们仍然打开。所以,我唯一剩下的问题是,如果我希望 exp_days 在浏览器关闭时过期,究竟应该设置什么?我注意到像 31572500 这样的数字有效,但为什么呢?如果 1 表示它明天到期,那么 31572500 不应该在 31572500 天后到期,而不是在会话结束时?
  • 当 Cookie 的值为 false ("") 或达到 expires 的值时,会移除 Cookie。 removeCookie 会同时执行这两个操作,因此在重新加载页面时 cookie 会消失(-1 表示昨天,因此会通过。我不确定 31572500 为什么有效,如果它不是溢出,它可能只会导致无效日期)。
  • 如果您不确定何时需要 cookie,您可以使用 let cookieValue = getCookie("name") 保存值,然后立即使用 removeCookie("name") 删除 cookie,然后使用 cookieValue 做任何您想做的事情。关闭浏览器后,cookie 已经消失,变量的值也被删除。
  • 将 cookie 值存储在变量中并丢弃 cookie 本身意味着它的值将在任何页面重新加载时丢失,而不是在浏览器关闭时丢失。
【解决方案2】:

我没有意识到当您在 Mac 上“关闭”浏览器时,仍然有一个浏览器进程保持活动状态。您必须明确退出浏览器。一旦我这样做了,cookie就消失了。

【讨论】:

    【解决方案3】:

    “警告:许多网络浏览器都有会话恢复功能,可以 保存所有选项卡并在下次使用浏览器时恢复它们。 会话 cookie 也将被恢复,就好像浏览器从未 关闭。”*

    你可以试试Max-Age=0

    “零或负数将立即使 cookie 过期。”*

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 2015-08-12
      • 2015-07-30
      • 2021-12-22
      • 2010-10-26
      • 2014-08-14
      • 2011-02-01
      • 1970-01-01
      相关资源
      最近更新 更多