使用JavaScript清除所有cookie


Answers:


318
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";
    }
}

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

  • 它不会删除HttpOnly设置了HttpOnly标志的cookie ,因为该标志会禁用Javascript对cookie的访问。
  • 它不会删除已设置Path值的cookie 。(尽管这些cookie会出现在中document.cookie,但您必须在未指定Path与它相同的值的情况下将其删除。)

5
不错,但是经过试验,我发现一个站点只能有一个不带=的cookie,然后它是一个无名的cookie,您实际上可以得到它的价值。因此,如果eqPos == 1,则应name = ""改为擦除无名值。
PhiLho

59
谨防!如果您的Cookie被配置为使用路径或域组件,则此方便的代码段将不起作用。
Dan Fabulich 2011年

1
真正。您可以修改此代码段,以要求您提供这些详细信息;但这适用于大多数情况。
罗伯特·J·沃克,

7
如何修改它以包含路径或域信息?
VUELA

2
至少在Chrome Cookie中,“;”之间用“;”分隔,因此我们必须trim()在额外的空格或split('; ')(“;”之间)使其正常工作。我建议进行修改。
丹尼尔·库卡尔

124

一支班轮

如果您想快速粘贴...

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

还有一个bookmarklet的代码:

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

1
一些持续性的网站备份饼干localStorage这样window.localStorage.clear()可能会有所帮助,以及
Klesun

75

这是清除域的所有路径和所有变体(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();
        }
    }
})();

10
这应该是最好的答案
Kanan Farzali

3
这个选项适用于Chrome浏览器,但我接受的答案无效
Orny

2
辉煌!在尝试了其他几个可以在我的开发服务器上工作但不在生产服务器上工作的工作之后,这是第一个同时在两个服务器上工作的工作。纯金!
Velojet

1
对我来说,这也比公认的答案好得多。谢谢
guillaumepotier

必须添加带有前导点的域代码,即使没有相关的子域,我的一些cookie也有,而有些则没有。但是有了这些更改,它对我来说效果很好,这是我迄今为止尝试过的最完整的实现。
Blauelf

66

在对此感到沮丧之后,我将这个函数组合在一起,它将尝试从所有路径中删除一个已命名的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 + ';';
    }
}

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


@TomHammond,这应该是一个全新的问题。主要问题涉及托管域与托管域以及您控制托管页面的能力。
AnthonyVO '16

2
这仍然不会删除httpOnly cookie。它们只能通过HTTP修改。
Sunny R Gupta

14

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

for (var it in $.cookie()) $.removeCookie(it);

我只是在自己的网站上尝试过,该网站删除了所有cookie。@Cerin sama可以在清除Cookie之前和之后尝试在控制台中执行以下代码吗?“用于(在$ .cookie()中将其更改)console.log(it);”
jichi 2014年

jichi您是否将jquery库与jquery.cookie插件一起包括在内?
ko1Rn

11

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

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

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

这里有一篇很棒的文章介绍了如何使用javascript处理cookie。


11
您也可以做document.cookie="username;expires=" + new Date(0).toGMTString()-如果Cookie在1秒钟前或1970
matt b

感谢你的这篇文章!
tx291

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";    
}

2
不处理路径。
斯科特·史密斯(Smith Smith)

6

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

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

似乎正在工作

编辑:哇几乎与Zach有趣的堆栈溢出如何使它们彼此相邻完全相同。

编辑:显然是临时的nvm


3

想通了,我会分享这种清除Cookie的方法。在某些时候也许对其他人有帮助。

var cookie = document.cookie.split(';');

for (var i = 0; i < cookie.length; i++) {

    var chip = cookie[i],
        entry = chip.split("="),
        name = entry[0];

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

2

您可以通过查看document.cookie变量来获取列表。清除所有内容仅是遍历所有内容并逐个清除它们。


2

我不知道为什么第一次投票的答案对我不起作用。

由于这样的回答说:

没有100%解决方案来删除浏览器cookie。

问题在于,cookie不仅通过其键“名称”而且还通过其“域”和“路径”来唯一标识。

如果不知道Cookie的“域”和“路径”,就无法可靠地删除它。无法通过JavaScript的document.cookie获得此信息。也无法通过HTTP Cookie标头使用!

所以我的想法是添加一个具有完整设置,获取和删除cookie的Cookie版本控件:

var cookie_version_control = '---2018/5/11';

function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name+cookie_version_control + "=" + (value || "")  + expires + "; path=/";
}

function getCookie(name) {
    var nameEQ = name+cookie_version_control + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function removeCookie(name) {   
    document.cookie = name+cookie_version_control+'=; Max-Age=-99999999;';  
}

这节省了我几个小时。值得赞扬。``let now = new Date(0);`` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; 将删除cookie。
CruelEngine

2

我有一些更复杂且面向OOP的cookie控制模块。它还包含deleteAll清除所有现有cookie的方法。请注意,此deleteAll方法版本具有path=/导致删除当前域内所有cookie的设置。如果您只需要从某个范围删除cookie,则必须升级此方法,并path在此方法中添加动态参数。

有主Cookie类:

import {Setter} from './Setter';

export class Cookie {
    /**
     * @param {string} key
     * @return {string|undefined}
     */
    static get(key) {
        key = key.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1');

        const regExp = new RegExp('(?:^|; )' + key + '=([^;]*)');
        const matches = document.cookie.match(regExp);

        return matches
            ? decodeURIComponent(matches[1])
            : undefined;
    }

    /**
     * @param {string} name
     */
    static delete(name) {
        this.set(name, '', { expires: -1 });
    }

    static deleteAll() {
        const cookies = document.cookie.split('; ');

        for (let cookie of cookies) {
            const index = cookie.indexOf('=');

            const name = ~index
                ? cookie.substr(0, index)
                : cookie;

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

    /**
     * @param {string} name
     * @param {string|boolean} value
     * @param {{expires?:Date|string|number,path?:string,domain?:string,secure?:boolean}} opts
     */
    static set(name, value, opts = {}) {
        Setter.set(name, value, opts);
    }
}

Cookie设置器方法(Cookie.set)非常复杂,因此我将其分解为其他类。有此代码:

export class Setter {
    /**
     * @param {string} name
     * @param {string|boolean} value
     * @param {{expires?:Date|string|number,path?:string,domain?:string,secure?:boolean}} opts
     */
    static set(name, value, opts = {}) {
        value = Setter.prepareValue(value);
        opts = Setter.prepareOpts(opts);

        let updatedCookie = name + '=' + value;

        for (let i in opts) {
            if (!opts.hasOwnProperty(i)) continue;

            updatedCookie += '; ' + i;

            const value = opts[i];

            if (value !== true)
                updatedCookie += '=' + value;
        }

        document.cookie = updatedCookie;
    }

    /**
     * @param {string} value
     * @return {string}
     * @private
     */
    static prepareValue(value) {
        return encodeURIComponent(value);
    }

    /**
     * @param {{expires?:Date|string|number,path?:string,domain?:string,secure?:boolean}} opts
     * @private
     */
    static prepareOpts(opts = {}) {
        opts = Object.assign({}, opts);

        let {expires} = opts;

        if (typeof expires == 'number' && expires) {
            const date = new Date();

            date.setTime(date.getTime() + expires * 1000);

            expires = opts.expires = date;
        }

        if (expires && expires.toUTCString)
            opts.expires = expires.toUTCString();

        return opts;
    }
}

1

这是删除JavaScript中所有cookie的简单代码。

function deleteAllCookies(){
   var cookies = document.cookie.split(";");
   for (var i = 0; i < cookies.length; i++)
     deleteCookie(cookies[i].split("=")[0]);
}

function setCookie(name, value, expirydays) {
 var d = new Date();
 d.setTime(d.getTime() + (expirydays*24*60*60*1000));
 var expires = "expires="+ d.toUTCString();
 document.cookie = name + "=" + value + "; " + expires;
}

function deleteCookie(name){
  setCookie(name,"",-1);
}

运行该功能deleteAllCookies()以清除所有cookie。


1

功能方法+ ES6

const cookieCleaner = () => {
  return document.cookie.split(";").reduce(function (acc, cookie) {
    const eqPos = cookie.indexOf("=");
    const cleanCookie = `${cookie.substr(0, eqPos)}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;`;
    return `${acc}${cleanCookie}`;
  }, "");
}

注意:不处理路径


0
//Delete all cookies
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:01 GMT;' +
            'path=' + '/;' +
            'domain=' + window.location.host + ';' +
            'secure=;';
    }
}

0

在对多种样式的Cookie进行多种样式的浏览器中列出的几乎所有方法的测试之后,我发现这里几乎没有任何方法可用,甚至50%。

请根据需要帮助纠正,但我要在这里扔2美分。以下方法分解了所有内容,并基本上基于设置项构建了cookie值字符串,并逐步构建了路径字符串,从/

希望这对其他人有帮助,我希望任何批评都可以以完善这种方法的形式出现。最初,我想要一个简单的1-liner,就像其他人一样,但是JS cookie是其中一件不那么容易处理的事情。

;(function() {
    if (!window['deleteAllCookies'] && document['cookie']) {
        window.deleteAllCookies = function(showLog) {
            var arrCookies = document.cookie.split(';'),
                arrPaths = location.pathname.replace(/^\//, '').split('/'), //  remove leading '/' and split any existing paths
                arrTemplate = [ 'expires=Thu, 01-Jan-1970 00:00:01 GMT', 'path={path}', 'domain=' + window.location.host, 'secure=' ];  //  array of cookie settings in order tested and found most useful in establishing a "delete"
            for (var i in arrCookies) {
                var strCookie = arrCookies[i];
                if (typeof strCookie == 'string' && strCookie.indexOf('=') >= 0) {
                    var strName = strCookie.split('=')[0];  //  the cookie name
                    for (var j=1;j<=arrTemplate.length;j++) {
                        if (document.cookie.indexOf(strName) < 0) break; // if this is true, then the cookie no longer exist
                        else {
                            var strValue = strName + '=; ' + arrTemplate.slice(0, j).join('; ') + ';';  //  made using the temp array of settings, putting it together piece by piece as loop rolls on
                            if (j == 1) document.cookie = strValue;
                            else {
                                for (var k=0;k<=arrPaths.length;k++) {
                                    if (document.cookie.indexOf(strName) < 0) break; // if this is true, then the cookie no longer exist
                                    else {
                                        var strPath = arrPaths.slice(0, k).join('/') + '/'; //  builds path line 
                                        strValue = strValue.replace('{path}', strPath);
                                        document.cookie = strValue;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            showLog && window['console'] && console.info && console.info("\n\tCookies Have Been Deleted!\n\tdocument.cookie = \"" + document.cookie + "\"\n");
            return document.cookie;
        }
    }
})();

也不起作用,或者至少对我不起作用...我必须通过HTTP删除cookie。
adelriosantiago

0

jQuery:

var cookies = $.cookie();
for(var cookie in cookies) {
$.removeCookie(cookie);
}

香草JS

function clearListCookies()
{   
 var cookies = document.cookie.split(";");
 for (var i = 0; i < cookies.length; i++)
  {   
    var spcook =  cookies[i].split("=");
    deleteCookie(spcook[0]);
  }
  function deleteCookie(cookiename)
   {
    var d = new Date();
    d.setDate(d.getDate() - 1);
    var expires = ";expires="+d;
    var name=cookiename;
    //alert(name);
    var value="";
    document.cookie = name + "=" + value + expires + "; path=/acc/html";                    
}
window.location = ""; // TO REFRESH THE PAGE
}

3
这需要jQuery Cookie插件。jQuery库没有cookie()函数。
Ruchira

-1

我在IE和Edge中发现了问题。Webkit浏览器(Chrome,Safari)似乎更宽容。设置cookie时,请始终将“路径”设置为某些内容,因为默认设置为设置cookie的页面。因此,如果您尝试在未指定“路径”的情况下在其他页面上使它过期,则该路径将不匹配,并且也不会过期。该document.cookie值不显示cookie的路径或有效期,因此您无法通过查看该值来得出cookie的设置位置。

如果您需要使不同页面上的cookie过期,请将设置页面的路径保存在cookie值中,以便以后将其拉出或始终附加"; path=/;"到cookie值中。然后它将从任何页面过期。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.