所以我有一个网站使用cookie来记住访问时的当前布局状态。一切都很好,直到我在网站上添加了一个Facebook“赞”按钮,生成了允许用户共享某个UI状态的链接(有点令人困惑但与问题无关)。
问题在于,当我通过其中一个Facebook链接访问该网站时,我的布局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风格的网址重新访问网站可以清除/重置卡住的cookie。所以它就像浏览器为每个URL路径保留一个单独的cookie,或者不允许根页面访问在另一个URL路径上设置的cookie。我以为我可以通过在cookie上明确设置path=/
来解决这个问题,但没有骰子。
更新2:
我发现如果我同时设置cookie的路径和域,我会在所有浏览器中获得不同的行为:
答案 0 :(得分:25)
Dude(tte),你的cookie setter中存在不一致和错误。
清除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有两个,但删除器没有。你会带来混乱。
我在上面引用的第二行代码中,在字符串连接表达式的中间引入了分号。在exdate.toUTCString()
之后。杀死它。杀了......现在。
至少在我的Google Chrome浏览器上,如果我在json = "[" + json + "]";
设置断点并在执行前修改setCookie
,我设法让它正常运行。
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, '/');