【问题标题】:Cookie is set twice; how to remove the duplicate?Cookie设置两次;如何删除重复项?
【发布时间】:2011-08-03 01:37:40
【问题描述】:

所以我有一个网站,它使用 cookie 来记住访问时的当前布局状态。一切都很好,直到我在网站上添加了一个 Facebook 的“喜欢”按钮,该按钮生成的链接允许用户共享特定的 UI 状态(有点令人困惑,但与问题并不真正相关)。

问题是,当我通过其中一个 Facebook 链接访问该站点时,似乎创建了我的布局 cookie 的第二个副本(如,我看到两个具有相同名称和不同值的 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/'}]"

忽略 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)。非常感谢任何帮助。

更新:

所以可靠地重现错误的步骤如下:

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

我还注意到,通过 Facebook 风格的 URL 重新访问该网站能够清除/重置卡住的 cookie。所以这就像浏览器为每个 URL 路径或其他东西保留一个单独的 cookie,并且不允许根页面访问在另一个 URL 路径上设置的 cookie。我想我可以通过在 cookie 上显式设置 path=/ 来解决这个问题,但没有骰子。

更新 2:

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

  1. Firefox - 现在可以正常工作了,万岁!曾经正常工作,然后就坏了,嘘!
  2. Chrome - 没有变化
  3. IE - 似乎为每个 URL 保留单独的 cookie,因此 Facebook 样式的 URL 记住一个状态,而标准 URL 记住一个不同的状态。两者都正确且相互独立地更新。这有点时髦,但仍然比卡住/损坏状态好得多。

【问题讨论】:

    标签: javascript cookies


    【解决方案1】:

    Dude(tte),您的 cookie 设置器中存在不一致和错误。

    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.toUTCString() 之后。杀死它。杀了它……现在。

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

    P/S:这是一次奇怪的调试体验,通过摆弄路径和域,我设法设置了 4 个 layoutState cookie。

    【讨论】:

    • 谢谢,我不敢相信在我试图让这段代码正常工作的所有时间里,我错过了一个这么大的错误。我也有点惊讶代码在该状态下没有引发任何错误。如果var c_value=escape(value) + "; expires=" + exdate.toUTCString(); 是一个语句,那么下一个语句是+ "; path=/spring; domain=aroth.no-ip.org";。那个有效的 JavaScript 是怎样的,它在执行时做了什么?无论如何,我解决了这些问题,现在一切似乎都很好,除了清理已经损坏的会话。
    • @aroth 有一种叫做一元的东西+。见xkr.us/articles/javascript/unary-add。而这里,我以为只有一元-,我以为只适用于数字,但实际上也和上面一样。
    • 感谢您解决这个问题。关于问题另一部分的任何想法:我们如何为已经被重复 cookie 卡住的用户删除 cookie?
    • 发现这个可以帮助我消除重复数据:stackoverflow.com/questions/2959010/…
    【解决方案2】:

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

    【讨论】:

    • 在这两种情况下,我都将 cookie 上的路径设置为相同的内容(//spring 都试过了)。就设置cookie的页面路径而言,这两种情况的唯一区别是一些额外的GET参数。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      发现问题并通过正确设置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
      }
      

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

      【讨论】:

        【解决方案5】:

        这是一个解决方案,/斜线有助于不要设置重复的同名cookie

        setcookie('YourCookieName','yes', time() + 400, '/');
        

        【讨论】:

          【解决方案6】:

          您可以在 Web 配置文件的 AppSettings 中添加以下键以解决重复 cookie 的问题。

          <!-- Tell ASPNET to avoid duplicate Set-Cookies on the Response Headers-->
          <appSettings>
            <add key="aspnet:AvoidDuplicatedSetCookie" value="true" />
          </appSettings>
          

          这将有助于避免响应标头中的重复 Set-Cookie()。

          【讨论】:

            【解决方案7】:

            看来问题不是 cookie 重复(cookie 会覆盖自己),而是 cookie 中的 DATA 重复。

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

            【讨论】:

            • 我试过了,我确实可以检测到 cookie 中何时存在重复数据。但是你建议我如何清理它?使用正则表达式替换数据等显而易见的解决方案似乎不起作用。
            猜你喜欢
            • 2021-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-28
            • 1970-01-01
            相关资源
            最近更新 更多