Cookie设置两次;如何删除副本?

时间:2011-04-11 13:06:33

标签: javascript cookies

所以我有一个网站使用cookie来记住访问时的当前布局状态。一切都很好,直到我在网站上添加了一个Facebook“赞”按钮,生成了允许用户共享某个UI状态的链接(有点令人困惑但与问题无关)。

问题在于,当我通过其中一个Facebook链接访问该网站时,我的布局cookie的第二个副本似乎被创建(如同,我看到两个具有相同名称和不同值的cookie)。这不会太糟糕,除了重复cookie的值似乎被卡住,再加上当用户返回站点时,浏览器会记住卡住的值而不是最近设置的值(所以它的类型就像有一个“好”的cookie我仍然可以使用,而一个“坏”的我不能,并且浏览器喜欢记住“坏”cookie而不是“好”cookie。这打破了我的布局跟踪/记忆功能。

所以这里有两个问题:

  1. 如何阻止这种情况发生/为什么会发生这种情况?
  2. 如何为已经卡住cookie的用户解决问题(我知道我可以为cookie选择一个新名称,但我宁愿通过找到一种方法来正确地解开卡住的cookie)?
  3. 如果我在访问处于卡住状态的页面后使用Chrome的开发者控制台,我可以看到document.cookie(为了便于阅读而添加了格式):

    layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':1000000,'url':'http://m.xkcd.com/303/'}]; 
    WibiyaNotification1=1; 
    WibiyaNotification213286=213286; 
    WibiyaNotification213289=213289; wibiya756904_unique_user=1; 
    JSESSIONID=DONTHIJACKMEPLEASE; 
    WibiyaProfile={"toolbar":{"stat":"Max"},"apps":{"openApps":{}},"connectUserNetworks":[null,null,null,null,null,null]}; 
    WibiyaLoads=59; 
    layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':6,'url':'http://m.xkcd.com/303/'}]"
    

    忽略Wibiya Cookie和JSESSIONID。卡住的cookie是第一个'layoutState'实例,我仍然可以在JavaScript中操作的是第二个'layoutState'实例。如果我改变一些事情,这就是我得到的:

    layoutState=[{'id':6,'x':8,'y':1525,'z':4,'url':'undefined'}, {'id':1,'x':625,'y':709,'z':2,'url':'undefined'}, {'id':2,'x':8,'y':37,'z':3,'url':'undefined'}, {'id':3,'x':625,'y':1179,'z':5,'url':'undefined'}, {'id':4,'x':626,'y':37,'z':1,'url':'undefined'}, {'id':5,'x':626,'y':357,'z':1000000,'url':'http://m.xkcd.com/303/'}]; 
    WibiyaNotification1=1;
    WibiyaNotification213286=213286; 
    WibiyaNotification213289=213289; 
    wibiya756904_unique_user=1; 
    JSESSIONID=DONTHIJACKMEPLEASE; 
    WibiyaProfile={"toolbar":{"stat":"Max"},"apps":{"openApps":{}},"connectUserNetworks":[null,null,null,null,null,null]}; 
    WibiyaLoads=59; 
    layoutState=[{'id':1,'x':8,'y':39,'z':1000000,'url':'undefined'}]
    

    第二个'layoutState'具有我希望浏览器记住的正确信息。然而,浏览器实际记得的是第一个实例的价值。

    我已经尝试完全取消设置cookie,这会导致第二个实例消失,但我所做的一切似乎都摆脱了第一个实例。我在所有主流浏览器(Chrome,Firefox,IE)中都有相同的行为,这让我怀疑我必须在这里做一些根本性的错误,但我不确定它是什么。

    您可以查看网站本身here。或者click here通过Facebook链接访问它(应该生成卡住的cookie)。非常感谢任何帮助。

    更新

    因此,可靠地重现错误的步骤如下:

    1. 通过Facebook-style link
    2. 访问该网站
    3. 对布局进行一些更改,然后关闭选项卡。
    4. 通过normal URL
    5. 访问该网站
    6. 应该正确记住初次访问时的布局,因此请更改一些内容然后刷新页面。当页面重新加载时,您的更改将不再被记住。
    7. 我还注意到,通过Facebook风格的网址重新访问网站可以清除/重置卡住的cookie。所以它就像浏览器为每个URL路径保留一个单独的cookie,或者不允许根页面访问在另一个URL路径上设置的cookie。我以为我可以通过在cookie上明确设置path=/来解决这个问题,但没有骰子。

      更新2:

      我发现如果我同时设置cookie的路径和域,我会在所有浏览器中获得不同的行为:

      1. Firefox - 现在正常工作,万岁!工作正常一次,然后破了,嘘!
      2. Chrome - 无变化
      3. IE - 似乎为每个URL保留单独的cookie,因此Facebook样式的URL会记住一个状态,标准URL会记住不同的状态。两者都正确且彼此独立地更新。这有点时髦,但仍然比卡住/破碎状态更好。

6 个答案:

答案 0 :(得分:25)

Dude(tte),你的cookie setter中存在不一致和错误。

1。确保正确设置路径和域

清除cookie并设置cookie时,路径和域应该相同。请在此处查看您的代码:

document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";

并将其与:

进行比较
var c_value=escape(value) + "; expires=" + exdate.toUTCString(); + "; path=/spring; domain=aroth.no-ip.org";

你会看到setter有两个,但删除器没有。你会带来混乱。

2。哦,那个令人讨厌的分号

我在上面引用的第二行代码中,在字符串连接表达式的中间引入了分号。在exdate.toUTCString()之后。杀死它。杀了......现在。

至少在我的Google Chrome浏览器上,如果我在json = "[" + json + "]";设置断点并在执行前修改setCookie,我设法让它正常运行。

P / S:这是一个很棒的调试体验,我设法设置4个layoutState cookie,摆弄路径&域。

答案 1 :(得分:3)

这可能过于简单,但为了以防万一,是否为两条不同的路径录制了Cookie?如果URL不同,您可能会将Cookie设置为受限制的路径,因此系统会采用不同的方式。

答案 2 :(得分:1)

如果您的网页加载了两次,请检查Chrome console -> Resources。这就是双cookie的原因。

答案 3 :(得分:0)

似乎问题不是重复的cookie(cookie会覆盖自己),而是cookie中的DATA重复。

我认为你必须修改读取cookie的脚本,并在检测到它时清除重复的值。

答案 4 :(得分:0)

在确定问题并通过正确设置cookie进行预防后,再次出现问题 您还需要在您或您客户的浏览器中删除以前错误设置的cookie。

因此,请观察开发人员工具中的Cookie集并搜索路径和子域,并将这些明确地放在要删除的代码上。

function eraseCookie(c_name) {
   document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";  

}

function eraseCookieWithPathDomain(c_name) {
       document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;path=/yourpath/to; domain=sub.domain.com";
       //you can remove this function call on your second upload if you are confirm that the previous cookie setter expired
}

您可能需要在eraseCookieWithPathDomain之后立即调用函数eraseCookie,或者甚至每次在文档加载后调用,具体取决于您的应用程序。

答案 5 :(得分:0)

这是一个解决方案,/斜杠帮助不要设置相同名称的重复cookie

setcookie('YourCookieName','yes', time() + 400, '/');