Löschen aller Cookies mit JavaScript

288

Wie löscht man alle Cookies für die aktuelle Domain mit JavaScript?

Eisbär
quelle

Antworten:

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

Beachten Sie, dass dieser Code zwei Einschränkungen aufweist:

  • Cookies mit HttpOnlygesetztem Flag werden nicht gelöscht , da das HttpOnlyFlag den Zugriff von Javascript auf das Cookie deaktiviert.
  • Cookies, die mit einem PathWert gesetzt wurden, werden nicht gelöscht . (Dies trotz der Tatsache, dass diese Cookies in angezeigt werden document.cookie, aber Sie können sie nicht löschen, ohne denselben PathWert anzugeben , mit dem sie festgelegt wurden.)
Robert J. Walker
quelle
5
Schön, aber nach dem Experimentieren habe ich festgestellt, dass eine Site nur ein Cookie ohne = haben kann, und dann ist es ein namenloses Cookie, man bekommt tatsächlich seinen Wert. Wenn also eqPos == 1 ist, sollten Sie name = ""stattdessen den namenlosen Wert löschen.
PhiLho
59
In acht nehmen! Wenn Ihre Cookies für die Verwendung eines Pfads oder einer Domänenkomponente konfiguriert sind, funktioniert dieses praktische Snippet nicht.
Dan Fabulich
1
Wahr. Das Snippet kann geändert werden, um Sie nach diesen Details zu fragen. Dies funktioniert jedoch in den meisten Fällen.
Robert J. Walker
7
Wie würde dies geändert, um die Pfad- oder Domäneninformationen einzuschließen?
VUELA
2
Zumindest in Chrome werden Cookies durch ";" getrennt, sodass wir trim()zusätzlichen Speicherplatz oder split('; ')(durch ';') benötigen, damit es ordnungsgemäß funktioniert. Ich habe eine Bearbeitung vorgeschlagen.
Daniel Kucal
124

Einzeiler

Für den Fall, dass Sie es schnell einfügen möchten ...

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

Und der Code für ein Lesezeichen:

javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Craig Smedley
quelle
1
Einige persistente Websites, auf denen Cookies gesichert werden localStorage, window.localStorage.clear()können ebenfalls hilfreich sein
Klesun,
75

Und hier ist eine, um alle Cookies in allen Pfaden und allen Varianten der Domain (www.mydomain.com, mydomain.com usw.) zu löschen:

(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();
        }
    }
})();
Jan.
quelle
10
Dies sollte die beste Antwort sein
Kanan Farzali
3
Dieser funktioniert für mich in Chrom, während die akzeptierte Antwort nicht funktioniert
Orny
2
Brillant! Nachdem ich einige andere ausprobiert hatte, die auf meinem Entwicklungsserver, aber nicht auf dem Produktionsserver funktionierten, war dies der erste, der auf beiden funktionierte. Reines Gold!
Velojet
1
Dies funktioniert auch bei mir viel besser als akzeptierte Antwort. danke
guillaumepotier
Musste Code für Domain mit führendem Punkt hinzufügen, einige meiner Cookies haben ihn, andere nicht, obwohl es keine relevanten Subdomains gibt. Aber mit diesen Änderungen funktioniert es gut für mich, die vollständigste Implementierung, die ich bisher versucht habe.
Blauelf
66

Nach ein wenig Frustration habe ich diese Funktion zusammengeschaltet, die versucht, ein benanntes Cookie aus allen Pfaden zu löschen. Rufen Sie dies einfach für jedes Ihrer Cookies auf und Sie sollten näher daran sein, jedes Cookie zu löschen, als Sie es zuvor waren.

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 + ';';
    }
}

Wie immer haben verschiedene Browser unterschiedliche Verhaltensweisen, aber das hat bei mir funktioniert. Genießen.

AnthonyVO
quelle
@ TomHammond, das sollte eine völlig neue Frage sein. Die Hauptprobleme betreffen die gehostete Domain im Vergleich zur Hosting-Domain und Ihre Fähigkeit, die gehostete Seite zu steuern.
AnthonyVO
2
Dadurch werden httpOnly-Cookies immer noch nicht entfernt. Sie können nur über HTTP geändert werden.
Sunny R Gupta
14

Wenn Sie Zugriff auf das Plugin jquery.cookie haben , können Sie alle Cookies folgendermaßen löschen:

for (var it in $.cookie()) $.removeCookie(it);
jichi
quelle
Ich habe es gerade auf meiner eigenen Website versucht, auf der alle Cookies gelöscht wurden. Könnte @Cerin sama versuchen, den folgenden Code in der Konsole vor und nach dem Löschen von Cookies auszuführen? "für (var it in $ .cookie ()) console.log (it);"
Jichi
jichi hast du die jquery library zusammen mit dem jquery.cookie plugin aufgenommen?
Ko1Rn
11

Soweit ich weiß, gibt es keine Möglichkeit, Cookies in der Domain pauschal zu löschen. Sie können ein Cookie löschen, wenn Sie den Namen kennen und sich das Skript in derselben Domäne wie das Cookie befindet.

Sie können den Wert auf leer und das Ablaufdatum auf irgendwo in der Vergangenheit setzen:

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

Es gibt hier einen ausgezeichneten Artikel über die Manipulation von Cookies mit Javascript.

ConroyP
quelle
11
Sie können auch einfach tun document.cookie="username;expires=" + new Date(0).toGMTString()- kein großer Unterschied, wenn der Cookie vor 1 Sekunde oder 1970 abläuft
matt b
Danke für den Artikel!
tx291
7

Einfacher. Schneller.

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";    
}
Dinesh
quelle
2
Behandelt keine Pfade.
Scott Smith
6

Eine Antwort, die sowohl von der zweiten Antwort hier als auch von W3Schools beeinflusst wird

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

Scheint zu funktionieren

edit: wow fast genau das gleiche wie zachs interessant, wie Stack Overflow sie nebeneinander stellt.

edit: nvm das war anscheinend nur vorübergehend

Jacob David C. Cunningham
quelle
3

Ich dachte, ich würde diese Methode zum Löschen von Cookies teilen. Vielleicht kann es irgendwann für jemand anderen hilfreich sein.

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;';
}
Zach Shallbetter
quelle
2

Sie können eine Liste erhalten, indem Sie in die Variable document.cookie schauen. Wenn Sie sie alle löschen, müssen Sie sie nur alle durchlaufen und einzeln löschen.

Sec
quelle
2

Ich weiß nicht, warum die erste Antwort bei mir nicht funktioniert.

Wie diese Antwort sagte:

Es gibt keine 100% ige Lösung zum Löschen von Browser-Cookies.

Das Problem ist, dass Cookies nicht nur anhand ihres Schlüssels "Name", sondern auch anhand ihrer "Domain" und ihres "Pfades" eindeutig identifiziert werden.

Ohne die "Domain" und den "Pfad" eines Cookies zu kennen, können Sie es nicht zuverlässig löschen. Diese Informationen sind nicht über JavaScript document.cookie verfügbar. Es ist auch nicht über den HTTP-Cookie-Header verfügbar!

Meine Idee ist es also, eine Cookie-Versionskontrolle mit allen Einstellungen hinzuzufügen, Cookies abzurufen und zu entfernen:

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;';  
}
Mashiro
quelle
das hat mir stunden gespart. verdient die Gegenstimme. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; werden die Cookies entfernt.
Grausamer Motor
2

Ich habe ein ausgefeilteres und OOP-orientiertes Cookie-Steuermodul. Es enthält auch eine deleteAllMethode zum Löschen aller vorhandenen Cookies. Beachten Sie, dass diese Version der deleteAllMethode Einstellungen enthält path=/, die das Löschen aller Cookies in der aktuellen Domain bewirken. Wenn Sie Cookies nur aus einem bestimmten Bereich löschen müssen, müssen Sie diese Methode aktualisieren, um Dynamik hinzuzufügenpath Parameter .

Es gibt Hauptklasse 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);
    }
}

Die Cookie-Setter-Methode ( Cookie.set) ist ziemlich komplex, daher habe ich sie in eine andere Klasse zerlegt. Es gibt Code von diesem:

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;
    }
}
B. Bohdan
quelle
1

Hier ist ein einfacher Code zum Löschen aller 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);
}

Führen Sie die Funktion aus deleteAllCookies(), um alle Cookies zu löschen.

Shubham Kumar
quelle
1

Funktionsansatz + 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}`;
  }, "");
}

Hinweis: Behandelt keine Pfade

Stefano Saitta
quelle
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=;';
    }
}
römisch
quelle
0

Nachdem ich fast alle Methoden getestet hatte, die in mehreren Browserstilen für mehrere Cookie-Stile aufgeführt waren, stellte ich fest, dass hier fast nichts funktioniert, selbst wenn sie zu 50% funktionieren.

Bitte helfen Sie bei Bedarf zu korrigieren, aber ich werde meine 2 Cent hier reinwerfen. Die folgende Methode zerlegt alles und erstellt im Wesentlichen die Cookie-Wertzeichenfolge, die sowohl auf den Einstellungselementen als auch auf einer schrittweisen Erstellung der Pfadzeichenfolge basiert, beginnend mit/ natürlich mit.

Ich hoffe, dies hilft anderen und ich hoffe, dass jede Kritik in Form einer Perfektionierung dieser Methode auftreten kann. Zuerst wollte ich einen einfachen 1-Liner, wie einige andere suchten, aber JS-Cookies sind eines der Dinge, mit denen man nicht so einfach umgehen kann.

;(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;
        }
    }
})();
SpYk3HH
quelle
Funktioniert auch nicht oder zumindest nicht für mich ... Ich musste die Cookies per HTTP löschen.
Adelriosantiago
0

Jquery:

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

Vanille 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
}
sureshvignesh
quelle
3
Dies erfordert das jQuery Cookie Plugin. Die jQuery-Bibliothek verfügt nicht über die Funktion cookie ().
Ruchira
-1

Ich habe ein Problem in IE und Edge gefunden. Webkit-Browser (Chrome, Safari) scheinen verzeihender zu sein. Stellen Sie beim Setzen von Cookies immer den "Pfad" auf etwas ein, da die Standardeinstellung die Seite ist, auf der das Cookie gesetzt wird. Wenn Sie also versuchen, es auf einer anderen Seite abzulaufen, ohne den "Pfad" anzugeben, stimmt der Pfad nicht überein und er läuft nicht ab. Dasdocument.cookie Wert zeigt weder den Pfad noch den Ablauf für ein Cookie an. Sie können also nicht anhand des Werts ableiten, wo das Cookie gesetzt wurde.

Wenn Sie Cookies von verschiedenen Seiten ablaufen lassen müssen, speichern Sie den Pfad der Einstellungsseite im Cookie-Wert, damit Sie ihn später herausziehen oder immer "; path=/;"an den Cookie-Wert anhängen können. Dann läuft es von jeder Seite ab.

Derek Wade
quelle