Effacer tous les cookies avec JavaScript

288

Comment supprimez-vous tous les cookies du domaine actuel en utilisant JavaScript?

ours polaire
la source

Réponses:

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

Notez que ce code a deux limitations:

  • Il ne supprimera pas les cookies avec HttpOnlyindicateur défini, car l' HttpOnlyindicateur désactive l'accès de Javascript au cookie.
  • Il ne supprimera pas les cookies qui ont été définis avec une Pathvaleur. (Ceci malgré le fait que ces cookies apparaîtront dans document.cookie, mais vous ne pouvez pas les supprimer sans spécifier la même Pathvaleur avec laquelle ils ont été définis.)
Robert J. Walker
la source
5
Bien, mais après avoir expérimenté, j'ai trouvé qu'un site ne peut avoir qu'un seul cookie sans =, et puis c'est un cookie sans nom, vous obtenez sa valeur en fait. Donc, si eqPos == 1, vous devriez faire à la name = ""place, pour effacer la valeur sans nom.
PhiLho
59
Il faut se méfier! Si vos cookies sont configurés pour utiliser un chemin d'accès ou un composant de domaine, cet extrait pratique ne fonctionnera pas.
Dan Fabulich
1
Vrai. L'extrait peut être modifié pour vous demander ces détails; mais cela fonctionne pour la plupart des cas.
Robert J. Walker
7
Comment cela serait-il modifié pour inclure les informations de chemin ou de domaine?
VUELA
2
Au moins dans les cookies Chrome sont séparés par ";", nous devons donc trim()l'espace supplémentaire ou split('; ')(par ';') pour le faire fonctionner correctement. J'ai proposé un montage.
Daniel Kucal
124

Bon mot

Au cas où vous voudriez le coller rapidement ...

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

Et le code d'un bookmarklet:

javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Craig Smedley
la source
1
Certains sites Web persistants sauvegardent les cookies dans localStoragedonc window.localStorage.clear()peuvent également être utiles
Klesun
75

Et voici un pour effacer tous les cookies dans tous les chemins et toutes les variantes du domaine (www.mydomain.com, mydomain.com etc.):

(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
la source
10
cela devrait être la meilleure réponse
Kanan Farzali
3
Celui-ci fonctionne pour moi en chrome, alors que la réponse acceptée ne fonctionne pas
Orny
2
Brillant! Après avoir essayé plusieurs autres qui fonctionnaient sur mon serveur de développement mais pas sur le serveur de production, ce fut le premier à travailler sur les deux. Or pur!
Velojet
1
Cela aussi pour moi fonctionne bien mieux que la réponse acceptée. merci
guillaumepotier
J'ai dû ajouter du code pour le domaine avec le premier point, certains de mes cookies l'ont, d'autres pas, même s'il n'y a pas de sous-domaines pertinents. Mais avec ces changements, cela fonctionne bien pour moi, l'implémentation la plus complète que j'ai essayée jusqu'à présent.
Blauelf
67

Après un peu de frustration avec moi-même, j'ai assimilé cette fonction qui tentera de supprimer un cookie nommé de tous les chemins. Appelez simplement cela pour chacun de vos cookies et vous devriez être plus près de supprimer tous les cookies que vous étiez avant.

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

Comme toujours, les différents navigateurs ont un comportement différent, mais cela a fonctionné pour moi. Prendre plaisir.

AnthonyVO
la source
@ TomHammond, Cela devrait être une toute nouvelle question. Les principaux problèmes concernent le domaine hébergé par rapport au domaine d'hébergement et votre capacité à contrôler la page hébergée.
AnthonyVO
2
Cela ne supprimera toujours pas les cookies httpOnly. Ils ne peuvent être modifiés que via HTTP.
Sunny R Gupta
14

Si vous avez accès au plugin jquery.cookie , vous pouvez effacer tous les cookies de cette façon:

for (var it in $.cookie()) $.removeCookie(it);
jichi
la source
Je viens de l'essayer sur mon propre site Web, qui a supprimé tous les cookies. @Cerin sama pourrait-il essayer d'exécuter le code suivant dans la console avant et après la suppression des cookies? "for (var it in $ .cookie ()) console.log (it);"
jichi
jichi avez-vous inclus la bibliothèque jquery avec le plugin jquery.cookie?
ko1Rn
11

Pour autant que je sache, il n'y a aucun moyen de supprimer une couverture d'un cookie défini sur le domaine. Vous pouvez effacer un cookie si vous connaissez le nom et si le script se trouve sur le même domaine que le cookie.

Vous pouvez définir la valeur sur vide et la date d'expiration quelque part dans le passé:

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

Il y a un excellent article ici sur la manipulation des cookies en utilisant javascript.

ConroyP
la source
11
Vous pouvez également faire juste document.cookie="username;expires=" + new Date(0).toGMTString()- pas beaucoup de différence si le cookie expire il y a 1 seconde ou en 1970
mat b
Merci pour l'article!
tx291
7

Plus simple. Plus rapide.

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
la source
2
Ne gère pas les chemins.
Scott Smith
6

Une réponse influencée par la deuxième réponse ici et W3Schools

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

Semble fonctionner

edit: wow presque exactement la même chose que Zach intéressant de voir comment Stack Overflow les a mis côte à côte.

edit: nvm qui était temporaire apparemment

Jacob David C. Cunningham
la source
3

Je pensais partager cette méthode pour effacer les cookies. Peut-être que cela peut être utile pour quelqu'un d'autre à un moment donné.

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
la source
2

Vous pouvez obtenir une liste en consultant la variable document.cookie. Les effacer tous consiste simplement à les parcourir tous et à les effacer un par un.

Seconde
la source
2

Je ne sais pas pourquoi la première réponse votée ne fonctionne pas pour moi.

Comme le disait cette réponse :

Il n'y a pas de solution à 100% pour supprimer les cookies du navigateur.

Le problème est que les cookies sont identifiés de manière unique non seulement par leur "nom" de clé, mais aussi par leur "domaine" et leur "chemin".

Sans connaître le «domaine» et le «chemin» d'un cookie, vous ne pouvez pas le supprimer de manière fiable. Ces informations ne sont pas disponibles via le document.cookie de JavaScript. Il n'est pas non plus disponible via l'en-tête HTTP Cookie!

Donc, mon idée est d'ajouter un contrôle de version des cookies avec l'ensemble complet de paramètres, obtenir, supprimer les cookies:

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
la source
cela m'a fait gagner des heures. mérite le vote positif. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; supprimera les cookies.
CruelEngine
2

J'ai un module de contrôle des cookies plus sophistiqué et orienté OOP. Il contient également une deleteAllméthode pour effacer tous les cookies existants. Notez que cette version de la deleteAllméthode a un paramètre path=/qui provoque la suppression de tous les cookies dans le domaine actuel. Si vous devez supprimer les cookies uniquement d'une certaine portée, vous devrez mettre à niveau cette méthode en ajoutant un pathparamètre dynamique à cette méthode.

Il y a une Cookieclasse principale :

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

La méthode de définition des cookies ( Cookie.set) est plutôt complexe, je l'ai donc décomposée en une autre classe. Il y a du code de celui-ci:

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;
    }
}
Bohdan
la source
1

Voici un code simple pour supprimer tous les cookies en 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);
}

Exécutez la fonction deleteAllCookies()pour effacer tous les cookies.

Shubham Kumar
la source
1

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

Remarque: ne gère pas les chemins

Stefano Saitta
la source
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=;';
    }
}
romain
la source
0

Après avoir testé presque toutes les méthodes répertoriées dans plusieurs styles de navigateurs sur plusieurs styles de cookies, j'ai trouvé que presque rien ici ne fonctionnait même à 50%.

Veuillez aider à corriger au besoin, mais je vais jeter mes 2 cents ici. La méthode suivante décompose tout et construit essentiellement la chaîne de valeur du cookie sur la base des deux paramètres, ainsi que l'inclusion d'une construction étape par étape de la chaîne de chemin d'accès, en commençant par /bien sûr.

J'espère que cela aide les autres et j'espère que toute critique pourra venir sous la forme de perfectionner cette méthode. Au début, je voulais un simple liner comme certains autres le souhaitaient, mais les cookies JS font partie de ces choses qui ne sont pas si faciles à gérer.

;(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
la source
Ne fonctionne pas non plus, ou du moins pas pour moi ... J'ai dû supprimer les cookies par HTTP.
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
la source
3
Cela nécessite le plugin jQuery Cookie. La bibliothèque jQuery n'a pas de fonction cookie ().
Ruchira
-1

J'ai trouvé un problème dans IE et Edge. Les navigateurs Webkit (Chrome, safari) semblent plus indulgents. Lors de la configuration des cookies, définissez toujours le "chemin" sur quelque chose, car la valeur par défaut sera la page qui a défini le cookie. Donc, si vous essayez de l'exirer sur une autre page sans spécifier le "chemin", le chemin ne correspondra pas et n'expirera pas. La document.cookievaleur n'affiche pas le chemin ou l'expiration d'un cookie, vous ne pouvez donc pas déterminer où le cookie a été défini en regardant la valeur.

Si vous devez expirer les cookies de différentes pages, enregistrez le chemin de la page de configuration dans la valeur du cookie afin de pouvoir le retirer plus tard ou toujours l'ajouter "; path=/;"à la valeur du cookie. Ensuite, il expirera de n'importe quelle page.

Derek Wade
la source