使用 JavaScript 清除所有 cookie

Posted

技术标签:

【中文标题】使用 JavaScript 清除所有 cookie【英文标题】:Clearing all cookies with JavaScript 【发布时间】:2010-09-15 19:31:58 【问题描述】:

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

【问题讨论】:

【参考方案1】:
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 值,则无法删除它。)

【讨论】:

不错的一个,但是经过实验,我发现一个站点可以只有一个没有=的cookie,然后它是一个无名cookie,你实际上得到了它的值。因此,如果 eqPos == 1,您应该改为使用name = "",以删除无名值。 当心!如果您的 cookie 被配置为使用路径或域组件,那么这个方便的 sn-p 将不起作用。 是的。可以修改 sn-p 以询问您这些详细信息;但这适用于大多数情况。 如何修改以包含路径或域信息? 至少在 Chrome cookie 中是用 "; " 分隔的,所以我们必须 trim() 额外的空格或 split('; ') (by '; ') 才能使其正常工作。我提出了修改建议。【参考方案2】:

一个班轮

如果您想快速粘贴...

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

还有一个小书签的代码:

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

【讨论】:

一些持久性网站会在 localStorage 中备份 cookie,因此 window.localStorage.clear() 也可能会有所帮助 official answer 有 2 个限制,这个答案能解决吗? 这个解决了我的 cookie 问题。谢谢:鞠躬:【参考方案3】:

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

【讨论】:

这应该是最好的答案 这个在 chrome 中对我有用,而接受的答案却没有 太棒了!在尝试了其他几个在我的开发服务器上工作但在生产服务器上没有工作的人之后,这是第一个在这两个服务器上工作的人。纯金! 这对我来说也比公认的答案好得多。谢谢 必须为带前导点的域添加代码,我的一些 cookie 有,有些没有,即使没有相关的子域。但是有了这些更改,它对我来说效果很好,这是我迄今为止尝试过的最完整的实现。【参考方案4】:

在我自己对此感到有点沮丧之后,我拼凑了这个函数,它将尝试从所有路径中删除一个命名的 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,这应该是一个全新的问题。主要问题在于托管域与托管域以及您控制托管页面的能力。 这仍然不会删除 httpOnly cookie。它们只能通过 HTTP 进行修改。【参考方案5】:

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

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

【讨论】:

我刚刚在自己的网站上尝试过,它删除了所有 cookie。 @Cerin sama 可以尝试在清除 cookie 之前和之后在控制台中执行以下代码吗? "for (var it in $.cookie()) console.log(it);" jichi 您是否将 jquery 库与 jquery.cookie 插件一起包含在内?【参考方案6】:

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

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

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

有一个excellent article here 使用 javascript 操作 cookie。

【讨论】:

你也可以只做document.cookie="username;expires=" + new Date(0).toGMTString() - 如果 cookie 在 1 秒前或 1970 年过期,差别不大【参考方案7】:

受此处的第二个答案和 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】:

以下代码将删除当前域和所有尾随子域(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`)
);

【讨论】:

这里唯一对我有用的解决方案(包括谷歌分析cookies)!非常感谢。【参考方案9】:

更简单。更快。

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

【讨论】:

不处理路径。【参考方案10】:

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

正如this answer所说:

没有 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。【参考方案11】:

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

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

访问caniuse.com 表以获取Cookie Store API 以检查浏览器支持

【讨论】:

请注意,截至今天,这仅适用于最新版本的 Chrome。【参考方案12】:

我想我会分享这个清除 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;';

【讨论】:

【参考方案13】:

我有一些更复杂和面向 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 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;
    

【讨论】:

【参考方案14】:
document.cookie.split(";").forEach(function(c)  
    document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); 
);
//clearing local storage
localStorage.clear();

【讨论】:

虽然此代码可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。 感谢您提供的有效信息。我很感激【参考方案15】:

您可以通过查看 document.cookie 变量来获得一个列表。清除它们只是循环所有它们并逐个清除它们的问题。

【讨论】:

【参考方案16】:

这是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。

【讨论】:

【参考方案17】:
//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=;';
    

【讨论】:

【参考方案18】:

函数式方法 + 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`;
  , "");

注意:不处理路径

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

我在这里做出贡献是因为此功能将允许您删除所有 cookie(匹配路径,默认情况下为 no-path 或 \以及设置为包含在子域中的 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))
    
  )
 

【讨论】:

【参考方案21】:

在针对多种样式的 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。【参考方案22】:

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

【讨论】:

这需要 jQuery Cookie 插件。 jQuery 库没有 cookie() 函数。【参考方案23】:

如果您想使用 js-cookie npm 包并按名称删除 cookie:

import cookie from 'js-cookie'

export const removeAllCookiesByName = (cookieName: string) => 
  const hostParts = location.host.split('.')
  const domains = hostParts.reduce(
    (acc: string[], current, index) => [
      ...acc,
      hostParts.slice(index).join('.'),
    ],
    []
  )
  domains.forEach((domain) => cookie.remove(cookieName,  domain ))


【讨论】:

【参考方案24】:

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

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

【讨论】:

以上是关于使用 JavaScript 清除所有 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在不保留任何到期时间的情况下清除 javascript 中的 cookie [重复]

Alamofire 清除所有 cookie

清除所有Cookie

js 清除 当前站点所有域cookie

我们可以使用 javascript、jsp 或 java 或 html 删除 HttpOnly 和 Secured Cookies 吗?

jquery 怎么设置cookie