使用JavaScript清除所有cookie

pol*_*ear 264 javascript cookies

如何使用JavaScript删除当前域的所有cookie?

Rob*_*ker 280

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此代码有两个限制:

  • 它不会删除带有HttpOnly标志集的cookie ,因为该HttpOnly标志禁用了Javascript对cookie的访问.
  • 它不会删除已使用Path值设置的cookie .(尽管这些cookie会出现在这里document.cookie,但是如果没有指定Path与其设置相同的值,则无法删除它.)

  • 谨防!如果您的cookie配置为使用路径或域组件,则此便捷代码段将无法使用. (56认同)
  • 很好,但经过实验,我发现一个网站只有一个没有=的cookie,然后它是一个无名的cookie,你实际得到它的价值.因此,如果eqPos == 1,你应该改为`name =""`来擦除无名值. (5认同)
  • 如何修改以包含路径或域信息? (5认同)
  • 这个答案是10岁,不起作用. (3认同)
  • 真的。可以修改该片段以询问您这些详细信息;但这适用于大多数情况。 (2认同)
  • @Cerin:虽然它可能对你不起作用,但它显然适用于其他一群人。也许您必须针对路径或域问题调整此代码。 (2认同)
  • 至少在Chrome中cookie被";"分隔,所以我们必须`trim()`额外的空格或`split(';')`(用';')来使它正常工作.我提出了一个编辑. (2认同)
  • 我们需要一种方法来处理像这样过时但得到高度评价的答案。 (2认同)
  • 如果这对您不起作用 - 尝试在 `var cookie = ` 行的末尾放置一个 `.trim()`,并将 `;path=/` 放在 `document.cookie 上的字符串的末尾= ` 行。 (2认同)

Cra*_*ley 114

一个班轮

如果你想快速粘贴它...

document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
Run Code Online (Sandbox Code Playgroud)

以及bookmarklet的代码:

javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Run Code Online (Sandbox Code Playgroud)

  • 一些持久性网站在“localStorage”中备份 cookie,因此“window.localStorage.clear()”也可能有帮助 (2认同)
  • [官方答案](/sf/answers/12566011/)有两个限制,这个答案能解决它们吗? (2认同)

Ant*_*yVO 64

在我自己有点沮丧之后,我将这个函数组合在一起,它将尝试从所有路径中删除一个命名的cookie.只需为每个cookie调用此选项,您就应该更接近删除之前的每个cookie.

function eraseCookieFromAllPaths(name) {
    // This function will attempt to remove a cookie from all paths.
    var pathBits = location.pathname.split('/');
    var pathCurrent = ' path=';

    // do a simple pathless delete first.
    document.cookie = name + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT;';

    for (var i = 0; i < pathBits.length; i++) {
        pathCurrent += ((pathCurrent.substr(-1) != '/') ? '/' : '') + pathBits[i];
        document.cookie = name + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT;' + pathCurrent + ';';
    }
}
Run Code Online (Sandbox Code Playgroud)

一如往常不同的浏览器有不同的行为,但这对我有用.请享用.

  • 这仍然不会删除httpOnly cookie.它们只能通过HTTP进行修改. (2认同)

Jan*_*Jan 60

这里有一个清除所有路径和域的所有变体(www.mydomain.com,mydomain.com等)中的所有cookie:

(function () {
    var cookies = document.cookie.split("; ");
    for (var c = 0; c < cookies.length; c++) {
        var d = window.location.hostname.split(".");
        while (d.length > 0) {
            var cookieBase = encodeURIComponent(cookies[c].split(";")[0].split("=")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path=';
            var p = location.pathname.split('/');
            document.cookie = cookieBase + '/';
            while (p.length > 0) {
                document.cookie = cookieBase + p.join('/');
                p.pop();
            };
            d.shift();
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最好的答案 (7认同)
  • 这个在 chrome 中对我有用,而接受的答案却没有 (3认同)
  • 杰出的!在尝试了在我的开发服务器上但不在生产服务器上运行的其他几个之后,这是第一个同时在这两个服务器上工作的。纯金! (2认同)
  • 这对我来说也比接受的答案要好得多。谢谢 (2认同)

Sla*_*ser 16

以下代码将删除当前域和所有尾随子域(www.some.sub.domain.example.some.sub.domain.example.sub.domain.example)内的所有 cookie。

一个单行普通 JS 版本(我认为这里唯一一个不使用cookie.split()):

document.cookie.replace(/(?<=^|;).+?(?=\=|;|$)/g, name => location.hostname.split('.').reverse().reduce(domain => (domain=domain.replace(/^\.?[^.]+/, ''),document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`,domain), location.hostname));
Run Code Online (Sandbox Code Playgroud)

这是这一行的可读版本:

document.cookie.replace(
  /(?<=^|;).+?(?=\=|;|$)/g,
  name => location.hostname
    .split(/\.(?=[^\.]+\.)/)
    .reduceRight((acc, val, i, arr) => i ? arr[i]='.'+val+acc : (arr[i]='', arr), '')
    .map(domain => document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`)
);
Run Code Online (Sandbox Code Playgroud)

  • 这里唯一对我有用的解决方案(包括谷歌分析cookie)!非常感谢。 (2认同)
  • 这适用于 chrome,但在 iOS 和 safari 上会产生错误,“SyntaxError:无效的正则表达式:无效的组说明符名称” (2认同)

jic*_*chi 14

如果您有权访问jquery.cookie插件,则可以通过以下方式删除所有cookie:

for (var it in $.cookie()) $.removeCookie(it);
Run Code Online (Sandbox Code Playgroud)


小智 13

如果您担心仅清除安全源上的 cookie,您可以使用Cookie Store API及其.delete()方法。

cookieStore.getAll().then(cookies => cookies.forEach(cookie => {
    console.log('Cookie deleted:', cookie);
    cookieStore.delete(cookie.name);
}));
Run Code Online (Sandbox Code Playgroud)

访问caniuse.com表中的Cookie Store API以检查浏览器支持情况

  • 请注意,截至目前,该功能仅适用于最新版本的 Chrome。 (7认同)

Con*_*oyP 11

据我所知,没有办法彻底删除域上的任何cookie集.如果您知道名称并且脚本与cookie位于同一域中,则可以清除cookie.

您可以将值设置为空,将过期日期设置为过去的某个位置:

var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString(); 
Run Code Online (Sandbox Code Playgroud)

这里有一篇关于使用javascript操纵cookie 的优秀文章.

  • 你也可以只做`document.cookie ="username; expires ="+ new Date(0).toGMTString()` - 如果cookie在1秒前或1970年到期,差别不大 (11认同)

Din*_*esh 7

简单.快点.

function deleteAllCookies() {
 var c = document.cookie.split("; ");
 for (i in c) 
  document.cookie =/^[^=]+/.exec(c[i])[0]+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT";    
}
Run Code Online (Sandbox Code Playgroud)

  • 不处理路径. (2认同)

Jac*_*ham 5

答案受到第二个答案和W3Schools的影响

document.cookie.split(';').forEach(function(c) {
  document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
Run Code Online (Sandbox Code Playgroud)

似乎工作

编辑:哇几乎和Zach一样有趣,Stack Overflow如何将它们放在一起.

编辑:显然是临时的nvm


小智 5

document.cookie.split(";").forEach(function(c) { 
    document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); 
});
//clearing local storage
localStorage.clear();
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以解决问题,但[包括解释](//meta.stackexchange.com/q/114762) 如何以及为何解决问题确实有助于提高帖子的质量,并可能会带来更多结果赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 (6认同)