使用JavaScript清除所有cookie

使用JavaScript清除所有cookie,javascript,cookies,Javascript,Cookies,如何使用JavaScript删除当前域的所有cookie?据我所知,无法全面删除域上的任何cookie集。如果您知道cookie的名称,并且脚本与cookie位于同一域中,则可以清除cookie 您可以将该值设置为空,并将到期日期设置为过去的某个位置: var mydate = new Date(); mydate.setTime(mydate.getTime() - 1); document.cookie = "username=; expires=" + mydate.toGMTString

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

据我所知,无法全面删除域上的任何cookie集。如果您知道cookie的名称,并且脚本与cookie位于同一域中,则可以清除cookie

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

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

使用javascript操作cookie有一个简单的方法。

您可以通过查看document.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";
    }
}
请注意,此代码有两个限制:

它不会删除设置了HttpOnly标志的cookie,因为HttpOnly标志禁用Javascript对cookie的访问。 它不会删除已使用路径值设置的Cookie。尽管这些cookie将出现在document.cookie中,但如果不指定设置它的路径值,则无法删除它。
在我自己对此感到有点沮丧之后,我完成了这个函数,它将尝试从所有路径中删除一个命名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 + ';';
    }
}
就像往常一样,不同的浏览器有不同的行为,但这对我来说很有效。
享受。

我想我会分享这个清除cookies的方法。也许它在某些方面对其他人有帮助

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;';
}
更简单。更快

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";    
}
如果您有权访问该插件,您可以通过以下方式擦除所有cookie:

for (var it in $.cookie()) $.removeCookie(it);
一班轮 如果您想快速粘贴它

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=/"); }); })();

这里有一个用于清除所有路径中的所有cookie以及域的所有变体www.mydomain.com、mydomain.com等:

(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();
        }
    }
})();

我在IE和Edge中发现了一个问题。Webkit浏览器Chrome、safari似乎更宽容。设置cookie时,请始终设置路径,因为默认设置为设置cookie的页面。因此,如果您尝试在其他页面上使其过期,而不指定路径,则路径将不匹配,也不会过期。document.cookie值不显示cookie的路径或过期时间,因此无法通过查看该值来推断cookie的设置位置

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

这里有一个简单的代码

运行函数DeleteAllCookie以清除所有Cookie。

函数方法+ES6 注意:不处理路径


在对多种风格的cookie测试了多种风格的浏览器中列出的几乎所有方法后,我发现这里几乎没有任何方法可以工作,甚至50%

请根据需要帮我改正,但我要把我的2美分扔到这里。下面的方法分解了所有内容,基本上基于两个设置片段构建cookie值字符串,并包括逐步构建路径字符串,当然是从/开始

希望这对其他人有所帮助,我也希望任何批评都能以完善这一方法的形式出现。起初,我想要一个简单的单行程序,正如其他人所寻求的,但是JS cookies是不容易处理的事情之一

;(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;
        }
    }
})();

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

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

编辑:哇,几乎和Zach有趣的Stack Overflow将它们放在一起的方式完全相同

编辑:显然是临时的nvm

Jquery:

香草JS


我不知道为什么第一个投票的答案不适合我

如前所述:

没有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;';  
}

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

有一个主要的Cookie类:

Cookie setter方法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;
    }
}

这里有几个答案不能解决路径问题。我相信:如果你控制了这个网站,或者部分网站,你应该知道所有使用的路径。所以你只需要让它从所有的cookies中删除所有cookies 使用的路径。 因为我的站点已经有了jquery,出于懒惰,我决定使用jquery cookie,但是您可以根据其他答案轻松地将其调整为纯javascript

在本例中,我删除了电子商务平台使用的三条特定路径

let mainURL = getMainURL().toLowerCase().replace('www.', '').replace('.com.br', '.com'); // i am a brazilian guy
let cookies = $.cookie();
for(key in cookies){
    // default remove
    $.removeCookie(key, {
        path:'/'
    });
    // remove without www
    $.removeCookie(key, {
        domain: mainURL,
        path: '/'
    });
    // remove with www
    $.removeCookie(key, {
        domain: 'www.' + mainURL,
        path: '/'
    });
};

// get-main-url.js v1
function getMainURL(url = window.location.href){
    url = url.replace(/.+?\/\//, ''); // remove protocol
    url = url.replace(/(\#|\?|\/)(.+)?/, ''); // remove parameters and paths
    // remove subdomain
    if( url.split('.').length === 3 ){
        url = url.split('.');
        url.shift();
        url = url.join('.');
    };
    return url;
};

我将.com网站更改为.com.br,因为我的网站是多域和多语言的

如果您只关心清除安全来源上的Cookie,则可以使用和的方法

document.cookie.split(";").forEach(function(c) { 
    document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); 
});
//clearing local storage
localStorage.clear();
cookieStore.getAll.thencookies=>cookies.forEachcookie=>{ console.log'Cookie deleted:',Cookie; cookieStore.deletecookie.name; };
以下代码将删除当前域和所有后续子域www.some.sub.domain.com、.some.sub.domain.com、.sub.domain.com等中的所有cookie

我认为这里唯一一个没有使用cookie.split的单行vanilla JS版本:

document.cookie.replace/?location.hostname.split'..reverse.reducedomain=>domain=domain.replace/^\.?[^.]+/,document.cookie=`${name}=;最大年龄=0;路径=/;domain=${domain}`,domain,location.hostname; 这是这一行的可读版本:

document.cookie.replace /? location.hostname .split/\.?=[^\.]+\/ .reduceRightacc、val、i、arr=>i?arr[i]='.+val+acc:arr[i]=,arr, .mapdomain=>document.cookie=`${name}=;最大年龄=0;路径=/;域=${domain}` ;

不错,但经过实验,我发现一个站点只有一个cookie,没有=,然后它是一个无名的cookie,你实际上得到了它的值。因此,如果eqPos==1,您应该改为使用name=来删除无名值。小心!如果您的Cookie配置为使用路径或域组件,则此方便的代码段将不起作用。True。可以修改代码片段以询问您这些详细信息;但这在大多数情况下都有效。如何修改它以包含路径或域信息?至少在Chrome cookie中,cookie之间用,因此,我们必须修剪额外的空间或分割';'用“;”让它正常工作。我建议进行编辑。您也可以只做document.cookie=username;expires=+new Date0.toGMTString-如果cookie在1秒前或1970年过期,则差异不大谢谢您的文章!我只是在自己的网站上尝试过,删除了所有的cookies。@Cerin sama能否在清除cookies之前和之后在控制台中执行以下代码?对于$cookie console.logit中的var it;jichi您是否将jquery库与jquery.cookie插件一起包含?不处理路径。@TomHammond,这应该是一个全新的问题。主要问题是托管域与托管域以及您控制托管页面的能力。这仍然不会删除httpOnly Cookie。它们只能通过HTTP进行修改。谢谢为我工作。这需要jQuery Cookie插件。jQuery库没有cookie函数。这应该是最好的答案。这一个在chrome中对我有效,而接受的答案并不正确!在尝试了其他几个在我的开发服务器上工作但在生产服务器上不工作的方法之后,这是第一个同时在这两个服务器上工作的方法。纯金!这对我来说也比公认的答案有效得多。感谢您为带前导点的域添加代码,我的一些cookie有,一些没有,即使没有相关的子域。但是有了这些改变,它对我来说很好,这是我迄今为止尝试过的最完整的实现。这节省了我几个小时。值得投票让我们现在=新日期0;`让expireTime=now.getTime;now.setTimeexpireTime;document.cookie=document.cookie+';expires='+now.toutString+';路径=/';将删除cookies。也不起作用,或者至少对我来说不起作用。。。我不得不通过HTTP删除Cookie。一些持久性网站在localStorage中备份Cookie,因此window.localStorage.clear可能也有帮助。这有两个限制,这个答案是否解决了它们?虽然这段代码可能解决了问题,但如何以及为什么解决这个问题会真正有助于提高您的帖子质量,而且可能会得到更多的支持票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。请注意,到目前为止,这仅适用于最新版本的Chrome。
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
}
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;';  
}
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);
    }
}
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;
    }
}
let mainURL = getMainURL().toLowerCase().replace('www.', '').replace('.com.br', '.com'); // i am a brazilian guy
let cookies = $.cookie();
for(key in cookies){
    // default remove
    $.removeCookie(key, {
        path:'/'
    });
    // remove without www
    $.removeCookie(key, {
        domain: mainURL,
        path: '/'
    });
    // remove with www
    $.removeCookie(key, {
        domain: 'www.' + mainURL,
        path: '/'
    });
};

// get-main-url.js v1
function getMainURL(url = window.location.href){
    url = url.replace(/.+?\/\//, ''); // remove protocol
    url = url.replace(/(\#|\?|\/)(.+)?/, ''); // remove parameters and paths
    // remove subdomain
    if( url.split('.').length === 3 ){
        url = url.split('.');
        url.shift();
        url = url.join('.');
    };
    return url;
};
document.cookie.split(";").forEach(function(c) { 
    document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); 
});
//clearing local storage
localStorage.clear();