Cancellare tutti i cookie con JavaScript


Risposte:


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

Si noti che questo codice ha due limitazioni:

  • Non eliminerà i cookie con HttpOnlyflag impostato, poiché il HttpOnlyflag disabilita l'accesso di Javascript al cookie.
  • Non eliminerà i cookie che sono stati impostati con un Pathvalore. (Ciò nonostante il fatto che quei cookie compariranno document.cookie, ma non è possibile eliminarlo senza specificare lo stesso Pathvalore con cui è stato impostato.)

5
Bello, ma dopo aver sperimentato, ho scoperto che un sito può avere un solo cookie senza =, e quindi è un cookie senza nome, ottieni effettivamente il suo valore. Quindi, se eqPos == 1, dovresti fare name = ""invece, per cancellare il valore senza nome.
PhiLho,

59
Attenzione! Se i tuoi cookie sono configurati per utilizzare un percorso o un componente di dominio, questo pratico frammento non funzionerà.
Dan Fabulich,

1
Vero. Lo snippet potrebbe essere modificato per richiedere tali dettagli; ma questo funziona nella maggior parte dei casi.
Robert J. Walker,

7
Come verrebbe modificato per includere il percorso o le informazioni sul dominio?
VUELA,

2
Almeno in Chrome i cookie sono separati da ";", quindi dobbiamo trim()aggiungere spazio o split('; ')(da ';') per farlo funzionare correttamente. Ho proposto una modifica.
Daniel Kucal,

124

Una fodera

Nel caso in cui desideri incollarlo rapidamente ...

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

E il codice per un bookmarklet:

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

1
Alcuni siti web persistenti biscotti di backup in localStoragemodo window.localStorage.clear()possono essere utili come pure
Klesun

75

Ed eccone uno per cancellare tutti i cookie in tutti i percorsi e in tutte le varianti del dominio (www.mydomain.com, mydomain.com ecc.):

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

10
questa dovrebbe essere la risposta migliore
Kanan Farzali,

3
Questo funziona per me in Chrome, mentre la risposta accettata no
Orny l'

2
Brillante! Dopo aver provato molti altri che hanno funzionato sul mio server di sviluppo ma non sul server di produzione, questo è stato il primo a funzionare su entrambi. Oro zecchino!
Velojet,

1
Anche questo per me funziona molto meglio della risposta accettata. grazie
guillaumepotier il

Ho dovuto aggiungere codice per il dominio con punto iniziale, alcuni dei miei cookie lo hanno, altri no, anche se non ci sono sottodomini rilevanti. Ma con queste modifiche, funziona bene per me, l'implementazione più completa che ho provato finora.
Blauelf

67

Dopo un po 'di frustrazione per questo, ho messo insieme questa funzione che tenterà di eliminare un cookie denominato da tutti i percorsi. Chiama questo per ciascuno dei tuoi cookie e dovresti essere più vicino alla cancellazione di tutti i cookie rispetto a prima.

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

Come sempre browser diversi hanno comportamenti diversi ma questo ha funzionato per me. Godere.


@TomHammond, dovrebbe essere una domanda completamente nuova. I problemi principali riguardano il dominio ospitato rispetto al dominio di hosting e la tua capacità di controllare la pagina ospitata.
AnthonyVO,

2
Questo non rimuoverà ancora i soli cookie http. Possono essere modificati solo su HTTP.
Sunny R Gupta,

14

Se hai accesso al plugin jquery.cookie , puoi cancellare tutti i cookie in questo modo:

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

L'ho appena provato sul mio sito Web, che ha eliminato tutti i cookie. @Cerin sama potrebbe provare a eseguire il seguente codice nella console prima e dopo aver cancellato i cookie? "for (var it in $ .cookie ()) console.log (it);"
jichi,

jichi hai incluso la libreria jquery insieme al plugin jquery.cookie?
ko1Rn

11

Per quanto ne so, non c'è modo di eliminare completamente i cookie impostati nel dominio. Puoi cancellare un cookie se conosci il nome e se lo script si trova nello stesso dominio del cookie.

È possibile impostare il valore su vuoto e la data di scadenza su un punto nel passato:

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

C'è un eccellente articolo qui sulla manipolazione dei cookie tramite JavaScript.


11
Puoi anche fare document.cookie="username;expires=" + new Date(0).toGMTString()- non c'è molta differenza se il cookie scade 1 secondo fa o nel 1970
matt b

Grazie per l'articolo!
tx291,

7

Più semplice. Più veloce.

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

2
Non gestisce i percorsi.
Scott Smith,

6

Una risposta influenzata sia dalla seconda risposta qui che da W3Schools

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

Sembra funzionare

modifica: stupisce quasi esattamente come Zach è interessante come Stack Overflow li abbia messi uno accanto all'altro.

edit: nvm apparentemente temporaneo


3

Ho pensato di condividere questo metodo per cancellare i cookie. Forse potrebbe essere utile per qualcun altro ad un certo punto.

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

2

È possibile ottenere un elenco esaminando la variabile document.cookie. Cancellarli tutti è solo una questione di passare in rassegna tutti loro e cancellarli uno per uno.


2

Non so perché la prima risposta votata non funzioni per me.

Come diceva questa risposta :

Non esiste una soluzione al 100% per eliminare i cookie del browser.

Il problema è che i cookie sono identificati in modo univoco non solo dal loro "nome" chiave, ma anche dal loro "dominio" e "percorso".

Senza conoscere il "dominio" e il "percorso" di un cookie, non è possibile eliminarlo in modo affidabile. Questa informazione non è disponibile tramite document.cookie di JavaScript. Non è nemmeno disponibile tramite l'intestazione del cookie HTTP!

Quindi la mia idea è quella di aggiungere un controllo versione Cookie con il set completo di impostazione, acquisizione, rimozione dei 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;';  
}

questo mi ha risparmiato ore. merita il voto. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; rimuoverà i cookie.
CruelEngine,

2

Ho un modulo di controllo dei cookie più sofisticato e orientato all'OOP. Contiene inoltre un deleteAllmetodo per cancellare tutti i cookie esistenti. Si noti che questa versione del deleteAllmetodo ha impostazioni path=/che causano la cancellazione di tutti i cookie all'interno del dominio corrente. Se è necessario eliminare i cookie solo da un determinato ambito, sarà necessario aggiornare questo metodo aggiungendo la mia dinamicapath parametro a questo metodo.

C'è la 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);
    }
}

Il metodo di impostazione dei cookie ( Cookie.set) è piuttosto complesso, quindi l'ho scomposto in un'altra classe. C'è un codice per questo:

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

1

Ecco un semplice codice per eliminare tutti i cookie 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);
}

Esegui la funzione deleteAllCookies()per cancellare tutti i cookie.


1

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

Nota: non gestisce i percorsi


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

0

Dopo aver testato quasi sempre il metodo elencato in più stili di browser su più stili di cookie, ho scoperto che quasi nulla qui funziona anche al 50%.

Aiutatemi a correggere se necessario, ma ho intenzione di gettare i miei 2 centesimi qui. Il seguente metodo suddivide tutto e fondamentalmente crea la stringa del valore del cookie in base a entrambe le parti delle impostazioni, oltre a includere una build passo passo della stringa del percorso, a partire /ovviamente.

Spero che questo aiuti gli altri e spero che qualsiasi critica possa venire sotto forma di perfezionamento di questo metodo. All'inizio volevo un semplice 1-liner come alcuni cercavano, ma i cookie JS sono una di quelle cose che non sono così facili da gestire.

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

Non funziona neanche, o almeno non per me ... Ho dovuto eliminare i cookie tramite HTTP.
adelriosantiago,

0

jquery:

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

vaniglia 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
}

3
Ciò richiede il plug-in jQuery Cookie. La libreria jQuery non ha la funzione cookie ().
Ruchira,

-1

Ho riscontrato un problema in IE e Edge. I browser Webkit (Chrome, Safari) sembrano essere più indulgenti. Quando si impostano i cookie, impostare sempre il "percorso" su qualcosa, poiché l'impostazione predefinita sarà la pagina che imposta il cookie. Quindi se provi a scadere su una pagina diversa senza specificare il "percorso", il percorso non corrisponderà e non scadrà. Ildocument.cookie valore non mostra il percorso o la scadenza di un cookie, quindi non è possibile determinare dove è stato impostato il cookie osservando il valore.

Se devi far scadere i cookie da pagine diverse, salva il percorso della pagina di impostazione nel valore del cookie in modo da poterlo estrarre in seguito o aggiungere sempre "; path=/;"al valore del cookie. Quindi scadrà da qualsiasi pagina.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.