Javascript Cookie设置两次;如何删除副本?
所以我有一个网站,它使用cookie来记住访问中的当前布局状态。一切都很顺利,直到我在网站上添加了一个Facebook“Like”按钮,该按钮可以生成允许用户共享某个UI状态的链接(有点混乱,但与问题无关) 问题是,当我通过其中一个Facebook链接访问该网站时,似乎会创建我的布局cookie的第二个副本(如中所示,我看到两个cookie具有相同的名称和不同的值)。这不会太可怕,除了重复cookie的值似乎被卡住,再加上当用户返回站点时,浏览器会记住卡住的值,而不是最近设置的值(因此这有点像我仍然可以使用的“好”cookie和“坏”cookie)一个我不能记住的,浏览器喜欢记住“坏”cookie而不是“好”cookie)。这破坏了我的布局跟踪/记忆功能 这里有两个问题:Javascript Cookie设置两次;如何删除副本?,javascript,cookies,Javascript,Cookies,所以我有一个网站,它使用cookie来记住访问中的当前布局状态。一切都很顺利,直到我在网站上添加了一个Facebook“Like”按钮,该按钮可以生成允许用户共享某个UI状态的链接(有点混乱,但与问题无关) 问题是,当我通过其中一个Facebook链接访问该网站时,似乎会创建我的布局cookie的第二个副本(如中所示,我看到两个cookie具有相同的名称和不同的值)。这不会太可怕,除了重复cookie的值似乎被卡住,再加上当用户返回站点时,浏览器会记住卡住的值,而不是最近设置的值(因此这有点像我
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)。非常感谢您的帮助
更新:
因此,可靠再现误差的步骤如下:
path=/
来解决这个问题,但不需要骰子
更新2:
我发现,如果同时设置cookie的路径和域,则在所有浏览器中都会出现不同的行为:
问题似乎不是重复的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, '/');