如何正确更新 cookie?

Posted

技术标签:

【中文标题】如何正确更新 cookie?【英文标题】:How to update a cookie properly? 【发布时间】:2016-01-29 20:04:12 【问题描述】:

我正在通过下面创建的代码 sn-p 创建和设置 cookie。

当我尝试获取 document.cookie 以验证我的 cookie 是否已正确创建时,我看到了一个差异

请允许我详细说明:

我正在使用由Math.floor(Math.random() * 2) 生成并存储在cookieValue 中的50/50 随机数生成器。因此,我确保我的 cookie 值始终为 0 或 1。此参数以及其余参数将成为 cookieStr 的一部分,它们将被传递到 document.cookie 以创建 cookie。

但是,为了验证这是否正确发生,我需要确保当前 cookie SomeCookieName 与我的 console.log(cookieStr) 的输出具有相同的值。这意味着我正在正确地动态更新 cookie。

快速查看下面的代码(在控制台中),我可以看出有些不对劲。 SomeCookieName 总是为 0,其中随机数生成器将分别输出 0 和 1。

TL;DR

我认为我没有正确更新SomeCookieName 参数的值,根据cookieValue 随机函数,它应该是01;但我不知道为什么会这样。我做错了什么?

var hoursToAdd = 3,
    daysToAdd = 10,
    cookieValue = Math.floor(Math.random() * 2), // Random value 0 or 1
    cookieName = "SomeCookieName",
    cookiePath = "/",
    cookieDomain = "*.somedomainname.com";

setCookie(cookieName, cookieValue, 0, hoursToAdd, cookiePath, cookieDomain);

console.log(document.cookie);

function setCookie(c_name, c_value, c_exdays, c_exhours, c_path, c_domain) 
  var exdate = new Date(),
      cookieStr = "";

  // Setting up the cookie value
  cookieStr = c_name + "=" + escape(c_value) + "; ";

  // Determining the expiration date increase: days or hours
  if (c_exdays)  // Adds days to current date
    exdate.setDate(exdate.getDate() + (c_exdays));
   
  else if (c_exhours)  // Adds hours to current date
    exdate.setHours(exdate.getHours() + c_exhours);
  

  // Setting up the cookie expiration date
  cookieStr += "expires=" + exdate.toUTCString() + "; ";
  
  // Setting up the cookie Path
  if (c_path) 
    cookieStr += "path=" + c_path + "; ";
  

  // Setting up the cookie Domain
  if (c_domain) 
    cookieStr += "domain=" + c_domain + "; ";
  
  
  console.log(cookieStr);

  // Creating the cookie 
  document.cookie = cookieStr;

编辑:添加控制台日志输出。

我正在查看的控制台输出对我来说似乎不稳定。那是因为我希望SomeCookieName 的值每次都应该相同。注意有两个console.log看上面的sn-p,自己试试看控制台输出:

一些CookieName=0;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:14:34;路径=/; domain=*.somedomainname.com;

一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2

一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:14:35;路径=/; domain=*.somedomainname.com;

一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2

一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:14:36;路径=/; domain=*.somedomainname.com;

一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2

一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:15:02;路径=/; domain=*.somedomainname.com;

一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2

一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:15:03;路径=/; domain=*.somedomainname.com;

一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2

【问题讨论】:

为我工作:jsfiddle.net/2oh4665w @Fabricator 你能详细说明一下吗?我正在查看控制台输出,发现 SomeCookieName 的值不同 每次都将其设置为 0 或 1。您是否希望 cookie 值在第一次设置后保持不变? @Fabricator 将其设置为 0 或 1 是正确的。我希望这样:创建值为 0 的 cookie,控制台日志 cookie 应显示值为 0,如果在创建 cookie 时值为 1,则控制台日志应显示 cookie 值为 1。那有意义吗?我认为我没有正确更新 cookie 值因为它没有向我显示所描述的行为......否则我误解了某些东西,我看不到它是什么 @Fabricator 你的小提琴对我不起作用,因为域不正确——我根本没有看到 SomeCookieName 被设置。 (它真的对你有用吗?还是我完全误解了这里的目标是什么?)我修改了域,以便确实有效,据我所知目标:jsfiddle.net/2oh4665w/1(OP:这是你的行为吗?期待?) 【参考方案1】:

如果您在设置document.cookie 时包含domain 参数,那么为了读取该cookie,domain 必须与运行脚本的页面的域/子域匹配。

在这种情况下,您可能会在较早时在测试时设置带有域的SomeCookieName=0。然后,您尝试更改它,但您包含无效的domain,因此未设置 cookie。

如果您使domain 与您的实际域匹配,或者完全省略它,cookie 将被设置并在您重置时更改。

【讨论】:

谢谢!我不知道会发生这种情况,特别是因为没有抛出无效参数的错误,即无效域

以上是关于如何正确更新 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

Django CSRF cookie 设置不正确

如何在 express 应用程序中正确访问 cookie

Asp.net mvc controller 中如何正确存取cookie

如何在页面打开后从 cookie 中正确设置属性(如果用户已登录)或使用路由器和 redux 在 React 中使用 F5

你如何正确地承诺请求?

为啥 SFSafariWebViewController 不能与 Safari 正确共享 cookie?