【问题标题】:How to avoid duplicate cookies如何避免重复的cookies
【发布时间】:2016-11-17 14:22:55
【问题描述】:

在我的应用程序中,我使用 jQuery Cookie Plugin v1.4.1 (https://github.com/carhartl/jquery-cookie) 设置了一个 cookie,如下所示:

$.removeCookie("Test_Cookie");
$.cookie("Test_Cookie", "xxx");

我希望这个 cookie 只存在一次,但在某些情况下 cookie 存在两次。

这怎么可能?确保某个 cookie 只存在一次的最佳做法是什么?

【问题讨论】:

  • “存在两次”是什么意思?你有两个Test_Cookie cookie 出现在用户的cookie jar 中?
  • 是的。查看 Fiddler 的截图:imgur.com/WlYu987
  • 检查原始标题并查看set-cookie 是什么。如果您有两个 cookie 但具有不同的路径,您可以获得相同的名称/值,而您的浏览器返回的那些是未定义/可变的。
  • 那么,如果我没听错的话,两个同名的 cookie 只有在路径不同的情况下才有可能?所以我也应该定义路径以避免它?像这样: $.removeCookie("Test_Cookie", { path: '/' }); $.cookie("Test_Cookie", "xxx", { path: '/' });

标签: javascript jquery cookies


【解决方案1】:

您可以使用String.prototype.split()document.cookie 转换为键值字符串数组(key=value),然后您可以遍历它们,拆分它们,如果键是值,则中断。请参阅下面的示例:

function checkCookieExists( cookieName ){
  var cookies = document.cookie.split(';'); //returns lots of these: key=value
  var toCheckCookie = cookieName; //checks if this cookie exists

  cookies.forEach(function( cookie ){ //foreach cookie
    var key = cookie.split('=')[0]; //the key cookie

    if (key.toLowerCase() === toCheckCookie) //if the current key is the toCheckCookie
    {
      return true;
    }
  });
  return true;

}

【讨论】:

    【解决方案2】:

    获取重复 cookie 的一种方法是在 company.com 上创建一个页面,在 dev.company.com 上创建一个页面。然后对 dev.company.com 的请求将获得域 .company.com 和 .dev.company.com 的 cookie。来自 dev.company.com 的 HTTP 响应永远不会更改浏览器为 company.com 存储的 cookie。这意味着您无法使用来自开发者的 HTTP 响应“清除”所有重复的 cookie。

    这可能令人沮丧,因为处理 cookie 的库通常只会返回单个 cookie 作为密钥。一个有效的 HTTP cookie 标头是 "Cookie: zyx=data1; zyx=data2" 然后您的库将只返回其中一个,可能是第一个。

    对此的常见解决方案是为不同的域使用不同的 cookie 密钥:“Cookie: dev.company.com-xyz=data1; company.com-xyz=data2”

    另一种解决方案是获取 HTTP Cookie 标头,在处理多个 Cookie 时对其进行解析,并使用第一个有效的。就像使用有效的身份验证或有效的 JWT。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多