如何正确更新Cookie?

时间:2016-01-29 20:04:13

标签: javascript cookies

我正在通过下面创建的代码段创建并设置Cookie。

当我尝试抓住document.cookie以验证我的Cookie是否已正确创建时,我发现差异

请允许我详细说明:

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

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

快速查看下面的代码(在控制台中),我可以说出一些不妥之处。它总是SomeCookieName为0,其中随机数发生器将分别输出0和1。

TL; DR

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

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查看上面的代码段并尝试自己查看控制台输出:

  

SomeCookieName = 0; expires = Fri,2016年1月29日23:14:34 GMT;路径= /;域= * somedomainname.com。

     

SomeCookieName = 0; _ga = GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48 = 2

     

SomeCookieName = 1;到期= 2016年1月29日星期五23:14:35 GMT;路径= /;域= * somedomainname.com。

     

SomeCookieName = 0; _ga = GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48 = 2

     

SomeCookieName = 1;到期= 2016年1月29日星期五23:14:36 GMT;路径= /;域= * somedomainname.com。

     

SomeCookieName = 0; _ga = GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48 = 2

     

SomeCookieName = 1;到期= 2016年1月29日星期五23:15:02 GMT;路径= /;域= * somedomainname.com。

     

SomeCookieName = 0; _ga = GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48 = 2

     

SomeCookieName = 1; expires = 2016年1月29日星期五23:15:03 GMT;路径= /;域= * somedomainname.com。

     

SomeCookieName = 0; _ga = GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48 = 2

1 个答案:

答案 0 :(得分:1)

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

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

如果您使domain与您的实际域名匹配,或者完全省略该域名,则会在您重置Cookie时设置并更改。