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

Javascript Cookie设置两次;如何删除副本?,javascript,cookies,Javascript,Cookies,所以我有一个网站,它使用cookie来记住访问中的当前布局状态。一切都很顺利,直到我在网站上添加了一个Facebook“Like”按钮,该按钮可以生成允许用户共享某个UI状态的链接(有点混乱,但与问题无关) 问题是,当我通过其中一个Facebook链接访问该网站时,似乎会创建我的布局cookie的第二个副本(如中所示,我看到两个cookie具有相同的名称和不同的值)。这不会太可怕,除了重复cookie的值似乎被卡住,再加上当用户返回站点时,浏览器会记住卡住的值,而不是最近设置的值(因此这有点像我

所以我有一个网站,它使用cookie来记住访问中的当前布局状态。一切都很顺利,直到我在网站上添加了一个Facebook“Like”按钮,该按钮可以生成允许用户共享某个UI状态的链接(有点混乱,但与问题无关)

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

这里有两个问题:

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

    忽略Wibiya cookies和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)中都有相同的行为,这让我怀疑我一定是在做一些根本错误的事情,但我不确定这是什么

    您可以查看站点本身。或者通过Facebook链接访问它(应该会生成一个卡住的cookie)。非常感谢您的帮助

    更新:

    因此,可靠再现误差的步骤如下:

  • 通过
  • 对布局进行一些更改,然后关闭选项卡
  • 通过访问网站
  • 应该正确地记住初次访问时的布局,因此需要更改一些内容,然后刷新页面。当页面重新加载时,您所做的更改将不再被记住
  • 我还注意到,通过Facebook风格的URL重新访问该网站可以清除/重置卡住的cookie。因此,这就像浏览器为每个URL路径或其他内容保留一个单独的cookie,而不允许根页面访问在另一个URL路径上设置的cookie。我想我可以通过在cookie上显式设置
    path=/
    来解决这个问题,但不需要骰子

    更新2:

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

  • Firefox-现在可以正常工作了,万岁!正常工作过一次,然后就坏了,呸
  • 铬-无变化
  • IE-似乎为每个URL保留单独的cookies,因此Facebook风格的URL记住一个状态,而标准URL记住一个不同的状态。两者都可以相互独立地正确更新。这有点怪,但仍然比卡住/断开状态好得多
    问题似乎不是重复的cookie(cookies会覆盖自身),而是cookie中数据的重复


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

    这可能太简单了,但以防万一,cookie是为两个不同的路径记录的吗?如果URL不同,您可能将cookie设置为受限路径,因此系统将以不同的方式处理它们。

    如果页面加载两次,请签入
    Chrome console->Resources
    。这就是双曲奇的原因

    老兄(tte),在你的饼干设定器中有不一致的地方和一个bug

    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同时拥有这两个属性,而deleter没有。你会带来混乱

    2.哦,还有那个讨厌的分号

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

    至少在我的Google Chrome上,如果我在
    json=“[”+json+“]”设置断点,我成功地让它正确运行并在执行前修改
    setCookie


    p/S:这是一次奇妙的调试体验,我通过摆弄路径和域成功地设置了4个
    layoutState
    cookies。

    在识别问题并通过正确设置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
    }
    

    您可能需要在
    橡皮擦cookie
    之后立即调用函数
    橡皮擦cookie WithPathDomain
    ,甚至每次加载文档后都需要调用该函数,具体取决于您的应用程序。

    这里有一个解决方案,/slash帮助不设置sa的重复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
    }
    
    setcookie('YourCookieName','yes', time() + 400, '/');