使用JavaScript清除所有cookie

时间:2008-10-07 16:41:55

标签: javascript cookies

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

23 个答案:

答案 0 :(得分:254)

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。
  • 它不会删除已使用Path值设置的Cookie。 (尽管这些cookie会出现在document.cookie中,但如果没有指定与其设置相同的Path值,则无法将其删除。)

答案 1 :(得分:100)

一个班轮

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

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

答案 2 :(得分:59)

在我自己有点沮丧之后,我将这个函数拼凑在一起,它将尝试从所有路径中删除一个命名的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 + ';';
    }
}

与往常不同的浏览器有不同的行为,但这对我有用。 享受。

答案 3 :(得分:45)

这里有一个清除所有路径中的所有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();
        }
    }
})();

答案 4 :(得分:15)

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

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

答案 5 :(得分:11)

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

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

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

使用javascript操作Cookie时有excellent article here

答案 6 :(得分:5)

简单。更快。

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

答案 7 :(得分:5)

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

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显然是暂时的

答案 8 :(得分: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;';
}

答案 9 :(得分:2)

您可以通过查看document.cookie变量来获取列表。清除所有这些只是循环所有这些并逐个清除它们。

答案 10 :(得分:2)

以下代码将删除当前域和所有尾随子域(www.some.sub.domain.com.some.sub.domain.com.sub.domain.com 等)中的所有 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));

这是这一行的可读版本:

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

答案 11 :(得分:2)

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

主要有{​​{1}}类:

Cookie

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.set

答案 12 :(得分:2)

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

正如this answer所说:

  

没有100%的解决方案可以删除浏览器Cookie。

     

问题在于,cookie不仅仅由他们的密钥&#34; name&#34;还有他们的&#34;域名&#34;和&#34;路径&#34;。

     

不知道&#34;域&#34;和&#34;路径&#34;一个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;';  
}

答案 13 :(得分:1)

以下是delete all cookies in JavaScript的简单代码。

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。

答案 14 :(得分:1)

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

答案 15 :(得分:1)

在多种风格的Cookie中测试了多种浏览器中列出的几乎所有方法之后,我发现这里几乎没有任何东西能用于50%。

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

希望这有助于其他人,我希望任何批评都可能以完善这种方法的形式出现。起初我想要一个简单的1-liner,正如其他人所寻求的那样,但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;
        }
    }
})();

答案 16 :(得分: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}`;
  }, "");
}
  

注意:不处理路径

答案 17 :(得分: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
}

答案 18 :(得分:0)

这里的几个答案没有解决路径问题。我相信:如果您控制该站点或其中的一部分,您应该知道所有使用的路径。所以你只需要让它从所有使用的路径中删除所有 cookie。 因为我的网站已经有 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,因为我的站点是多域和多语言的

答案 19 :(得分:0)

如果您担心只在安全来源上清除 cookie,您可以使用 Cookie Store API 和它的 .delete() 方法。

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

答案 20 :(得分: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=;';
    }
}

答案 21 :(得分:0)

我在这里贡献是因为此功能将允许您删除所有 cookie(匹配路径,默认情况下为无路径或 \还有设置为包含在子域中的 cookie

function clearCookies( wildcardDomain=false, primaryDomain=true, path=null ){
  pathSegment = path ? '; path=' + path : ''
  expSegment = "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"
  document.cookie.split(';').forEach(
    function(c) { 
      primaryDomain && (document.cookie = c.replace(/^ +/, "").replace(/=.*/, expSegment + pathSegment))
      wildcardDomain && (document.cookie = c.replace(/^ +/, "").replace(/=.*/, expSegment + pathSegment + '; domain=' + document.domain))
    }
  )
} 

答案 22 :(得分:-1)

我在IE和Edge中发现了一个问题。 Webkit浏览器(Chrome,safari)似乎更宽容。设置cookie时,请始终将“路径”设置为某个内容,因为默认设置将是设置cookie的页面。因此,如果您尝试在不指定“路径”的情况下将其在不同页面上过期,则路径将不匹配且不会过期。 document.cookie值不显示Cookie的路径或过期,因此您无法通过查看值来获取Cookie的设置位置。

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