【发布时间】:2011-08-03 01:37:40
【问题描述】:
所以我有一个网站,它使用 cookie 来记住访问时的当前布局状态。一切都很好,直到我在网站上添加了一个 Facebook 的“喜欢”按钮,该按钮生成的链接允许用户共享特定的 UI 状态(有点令人困惑,但与问题并不真正相关)。
问题是,当我通过其中一个 Facebook 链接访问该站点时,似乎创建了我的布局 cookie 的第二个副本(如,我看到两个具有相同名称和不同值的 cookie)。这不会太糟糕,除了重复 cookie 的值似乎被卡住了,再加上当用户返回站点时浏览器会记住卡住的值而不是最近设置的值(所以它有点像就像有一个我仍然可以使用的“好”cookie,以及一个我不能使用的“坏”cookie,并且浏览器喜欢记住“坏”cookie而不是“好”cookie)。这破坏了我的布局跟踪/记忆功能。
所以这里有两个问题:
- 我该如何阻止这种情况的发生/首先为什么会发生这种情况?
- 如何为已经有 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/'}]"
忽略 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)。非常感谢任何帮助。
更新:
所以可靠地重现错误的步骤如下:
- 通过Facebook-style link访问网站
- 对布局进行一些更改,然后关闭选项卡。
- 通过normal URL访问该网站。
- 应该正确记住初次访问时的布局,因此请更改一些内容,然后刷新页面。当页面重新加载时,您的更改将不再被记住。
我还注意到,通过 Facebook 风格的 URL 重新访问该网站能够清除/重置卡住的 cookie。所以这就像浏览器为每个 URL 路径或其他东西保留一个单独的 cookie,并且不允许根页面访问在另一个 URL 路径上设置的 cookie。我想我可以通过在 cookie 上显式设置 path=/ 来解决这个问题,但没有骰子。
更新 2:
我发现如果我同时设置 cookie 的路径和域,我会在所有浏览器中得到不同的行为:
- Firefox -
现在可以正常工作了,万岁!曾经正常工作,然后就坏了,嘘! - Chrome - 没有变化
- IE - 似乎为每个 URL 保留单独的 cookie,因此 Facebook 样式的 URL 记住一个状态,而标准 URL 记住一个不同的状态。两者都正确且相互独立地更新。这有点时髦,但仍然比卡住/损坏状态好得多。
【问题讨论】:
标签: javascript cookies