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

aro*_*oth 24 javascript cookies

所以我有一个网站使用cookie记住跨访问的当前布局状态.一切是伟大的工作,直到我加入了Facebook的"喜欢"按钮,其生成允许用户共享一定的UI状态(有点混乱,但没有真正的问题有关)链接的网站.

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

所以这里有两个问题:

  1. 我该如何阻止这种情况发生?为什么会发生这种情况?
  2. 如何为已经卡住cookie的用户解决问题(我知道我可以为cookie选择一个新名称,但我宁愿通过找到一种方法来正确地解开卡住的cookie)?

如果我在访问处于卡住状态的页面后使用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/'}]"
Run Code Online (Sandbox Code Playgroud)

忽略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'}]
Run Code Online (Sandbox Code Playgroud)

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

我试过解封完全饼干,导致二审消失了,但没有我这样做似乎摆脱了一审.我在所有主流浏览器(Chrome,Firefox,IE)中都有相同的行为,这让我怀疑我必须在这里做一些根本错误的事情,但我不确定它是什么.

您可以在此处查看网站本身.或点击此处通过Facebook链接访问它(应生成卡住的cookie).任何帮助深表感谢.

更新:

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

  1. 通过Facebook风格的链接访问该网站
  2. 对布局进行一些更改,然后关闭选项卡.
  3. 通过普通网址访问该网站.
  4. 应该正确记住初次访问时的布局,因此请更改一些内容然后刷新页面.页面重新加载时,您的更改将不再被记住.

我还注意到,通过Facebook风格的URL重新访问该网站可以清除/重置卡住的cookie.所以,它就像浏览器是保持一个独立的cookie为每个URL路径,或什么的,而不是让根页面访问被对方URL路径上设置cookie.我以为我可以通过明确设置path=/cookie 来解决这个问题,但没有骰子.

更新2:

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

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

syo*_*kit 26

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

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

清除cookie并设置cookie时,路径和域应该相同.在这里查看您的代码:

document.cookie = c_name + "=; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
Run Code Online (Sandbox Code Playgroud)

并将其与:

var c_value=escape(value) + "; expires=" + exdate.toUTCString(); + "; path=/spring; domain=aroth.no-ip.org";
Run Code Online (Sandbox Code Playgroud)

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

哦,那个讨厌的分号

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

至少在我的谷歌浏览器上,我设法让它正常运行,如果我设置断点json = "[" + json + "]";setCookie在执行之前进行修改.

P/S:这是一个古怪的调试经验,我设法layoutState通过摆弄路径和域来设置4个cookie.


boi*_*ert 6

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