web-dev-qa-db-fra.com

Effacer tous les cookies avec JavaScript

Comment supprimez-vous tous les cookies du domaine actuel à l'aide de JavaScript?

244
polarbear
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 le drapeau HttpOnly, car le drapeau HttpOnly désactive l'accès de Javascript au cookie.
  • Il ne supprimera pas les cookies qui ont été définis avec une valeur Path. (Ceci en dépit du fait que ces cookies apparaîtront dans document.cookie, mais vous ne pouvez pas le supprimer sans spécifier la même valeur Path avec laquelle il a été défini.)
265
Robert J. Walker

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 pour un bookmarklet:

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

Après un peu de frustration avec moi-même, j'ai combiné cette fonction qui tentera de supprimer un cookie nommé de tous les chemins. Appelez simplement ceci pour chacun de vos cookies et vous devriez être plus proche de la suppression de chaque 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 + ';';
    }
}

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

61
AnthonyVO

Et voici un moyen pour effacer tous les cookies dans tous les chemins et toutes les variantes du domaine (www.mondomaine.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();
        }
    }
})();
49
Jan

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);
14
jichi

Autant que je sache, il est impossible de supprimer totalement 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 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 de cookies en utilisant javascript.

11
ConroyP

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

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

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

Semble travailler

edit: wow, presque exactement comme Zach est intéressant de voir comment Stack Overflow les a placés les uns à côté des autres.

edit: nvm qui était temporaire apparemment

Je pensais partager cette méthode pour effacer les cookies. Peut-être que cela pourrait ê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;';
}
3
Zach Shallbetter

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

Comme cette réponse dit:

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 clé "nom" mais également par leur "domaine" et "chemin".

Sans connaître le "domaine" et le "chemin" d'un cookie, vous ne pouvez pas le supprimer de manière fiable. Cette information n'est pas disponible via le document.cookie de JavaScript. Ce n'est pas disponible non plus via l'en-tête HTTP Cookie!

Donc, mon idée est d’ajouter un contrôle de version de cookie avec l’ensemble des paramètres permettant d’obtenir et de supprimer des 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;';  
}
2
Mashiro

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

Il y a la classe principale 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);
    }
}

La méthode de définition de cookie (Cookie.set) est assez complexe, alors je l'ai décomposée en une autre classe. Il y a un 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;
    }
}
2
B. Bohdan

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

2
Sec

Voici un code simple à 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.

1
Shubham Kumar

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

Note: Ne gère pas les chemins

1
Stefano Saitta
//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=;';
    }
}
0
Roman

Après avoir testé presque toujours la méthode répertoriée dans plusieurs styles de navigateurs sur plusieurs styles de cookies, j'ai constaté que presque rien ne fonctionne ici même à 50%.

S'il vous plaît aider à corriger si nécessaire, mais je vais jeter mes 2 cents ici. La méthode suivante décompose tout et construit en gros la chaîne de valeur du cookie en fonction des éléments de configuration et en incluant 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 aidera les autres et j'espère que toute critique viendra sous forme de perfectionner cette méthode. Au début, je voulais un simple 1-liner comme d'autres, mais les cookies JS font partie de ces problèmes difficiles à 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;
        }
    }
})();
0
SpYk3HH

Jquery:

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

Vanilla 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
}
0
sureshvignesh