【问题标题】:Unable to delete cookie from javascript无法从 javascript 中删除 cookie
【发布时间】:2011-08-07 00:08:32
【问题描述】:

我在一个外部网站上,我正在尝试通过 javascript 删除 cookie。

我在控制台中做了以下操作:

function deleteAllCookies() {
    var cookies = document.cookie.split(";");

    for (var i = 0; i < cookies.length; i++) {
        var cookie = cookies[i];
        var eqPos = cookie.indexOf("=");
        var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
        document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
    }
}

deleteAllCookies()

应该将文档 cookie 设置为在 1970 年到期

但在那之后,我打电话给

document.cookie.split(";")

这些 cookie 似乎没有受到影响。任何想法为什么?

PS:以上代码来自stackoverflow Clearing all cookies with JavaScript

【问题讨论】:

  • 您只能删除您要从中删除它们的域上的 cookie。您不能删除跨域 cookie。
  • 发布您的 cookie 数据。它在这里为我工作:jsfiddle.net/WbGYV/1
  • 谢谢大家!我正在从控制台执行此代码,并且我在 wsj 上。 online.wsj.com/article/…
  • 我在 online.wsj.com,我认为 cookie 位于 wsj.com 域中

标签: javascript cookies


【解决方案1】:

您的 cookie 很可能不会被删除,因为当您设置新值时,它必须与您尝试删除的原始 cookie 的路径和域相匹配。

换句话说:

 document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=[something];"

“某物”值需要与现有 cookie 设置的内容保持一致。

JS 调试器可能不会为您提供有关路径和域的详细信息,但如果您在 Chrome->设置或类似面板中查找现有 cookie 的值,您将很明显不匹配哪个在 Firefox/Safari/IE 中。

如果有帮助,请告诉我。

【讨论】:

  • 我在 IE 和 Edge 中发现了这个问题。最好始终设置路径,因为默认设置为设置 cookie 的页面。因此,如果您尝试在其他页面上使其过期,则路径将不匹配并且不会过期。在 IE 和 Edge 中,它似乎从 document.cookie 值中隐藏了过期和路径,因此您无法通过查看值来推断 cookie 的设置位置。如果需要,请将设置页面的路径保存在 cookie 值中,以便稍后将其拉出。或总是附加“;路径=/;”到 cookie 值。那么它将从任何页面过期。
【解决方案2】:

对我来说,问题是我设置了domain 字段,只有在设置 cookie 时覆盖它才需要。因此,以下应该可以解决问题:

document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"

【讨论】:

    【解决方案3】:

    我在尝试删除某些 cookie 时遇到了类似的问题。有时这有效:

    document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;';

    ...有时它没有。

    在查看 Chrome 检查器(应用程序选项卡 -> 存储侧边栏 -> Cookies)后,我注意到一些 cookie 设置为不同的域。示例:

    .mydoamin.com
    sub.mydomain.com 
    

    所以,我的解决方案是创建一个通用函数,从所有域中删除 cookie。

    var deleteCookie = function(name) {
        document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;domain=.mydomain.com;';
        document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;domain=sub.mydomain.com;';
    };
    

    【讨论】:

      【解决方案4】:

      Clear session cookies in ie11?

      可能是上面的链接可以提供帮助

      只需像下面那样运行 JavaScript

      document.execCommand("ClearAuthenticationCache")
      

      我试过了,cookie被清除了。

      【讨论】:

        【解决方案5】:

        我正在开发一个浏览器书签以从当前域中删除 cookie,我遇到了同样的问题,我的问题是我也没有使用域。这是我最终的书签值:

        javascript: (function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";domain=." + location.host.split('.').slice(-2).join(".") +";path=/"); }); })();
        

        请注意,我将“domain.com”替换为 location.host.split('.').slice(-2).join(".") 以便我始终获得没有子域名的域名,即邮件。 google.com 将成为 google.com。在设置 cookie 到期时,我们应该忽略子域名(至少在我的情况下是这样的。

        【讨论】:

          【解决方案6】:

          我有同样的问题。我发现 cookie 设置在一个空的子域下,例如cookie 域是“.domain.com”,我的网站托管在“sub.domain.com”。

          为了修复,我将 cookie 域添加到设置值

          document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=.domain.com";
          

          要查看 cookie 设置的域,请在 Chrome 中打开开发工具 -> 资源 -> cookie 并查看域字段。

          【讨论】:

          • 此解决方案适用于我们的实例。仅使用 expirypath 参数无法清除我们的 cookie,但是一旦添加了 domain 参数,它就解决了问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 2020-06-11
          • 1970-01-01
          • 2013-02-21
          • 2015-06-29
          • 2012-01-20
          相关资源
          最近更新 更多