Usuwanie wszystkich plików cookie za pomocą JavaScript

288

Jak usunąć wszystkie pliki cookie dla bieżącej domeny za pomocą JavaScript?

Niedźwiedź polarny
źródło

Odpowiedzi:

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

Pamiętaj, że ten kod ma dwa ograniczenia:

  • Nie usunie plików cookie z HttpOnlyustawioną flagą, ponieważ HttpOnlyflaga wyłącza dostęp Javascript do pliku cookie.
  • Nie usunie plików cookie, które zostały ustawione z Pathwartością. (Dzieje się tak pomimo faktu, że te pliki cookie pojawią się w document.cookie, ale nie można ich usunąć bez podania tej samej Pathwartości, z jaką zostały ustawione).
Robert J. Walker
źródło
5
Fajny, ale po eksperymentach odkryłem, że strona może mieć tylko jeden plik cookie bez =, a następnie jest to bezimienny plik cookie, faktycznie uzyskujesz jego wartość. Jeśli więc eqPos == 1, powinieneś to zrobić name = "", aby usunąć bezimienną wartość.
PhiLho,
59
Strzec się! Jeśli pliki cookie są skonfigurowane do korzystania ze ścieżki lub komponentu domeny, ten przydatny fragment kodu nie będzie działał.
Dan Fabulich,
1
Prawdziwe. Fragment kodu można zmodyfikować, aby poprosić o te szczegóły; ale to działa w większości przypadków.
Robert J. Walker,
7
Jak można to zmodyfikować, aby uwzględnić informacje o ścieżce lub domenie?
VUELA,
2
Przynajmniej w Chrome pliki cookie są oddzielone „;”, więc musimy przejść do trim()dodatkowego miejsca lub split('; ')(przez „;”), aby działało poprawnie. Zaproponowałem edycję.
Daniel Kucal
124

Jedna wkładka

Jeśli chcesz szybko wkleić ...

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

I kod dla bookmarkletu:

javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Craig Smedley
źródło
1
Niektóre Persistant stron internetowych ciasteczka kopii zapasowych w localStorageSO window.localStorage.clear()mogą być pomocne także
Klesun
75

I tutaj jest jeden, aby wyczyścić wszystkie pliki cookie we wszystkich ścieżkach i wszystkich wariantach domeny (www.mydomain.com, mydomain.com itp.):

(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
źródło
10
to powinna być najlepsza odpowiedź
Kanan Farzali
3
Ten działa dla mnie w chromie, a zaakceptowana odpowiedź nie
Orny
2
Znakomity! Po wypróbowaniu kilku innych, które działały na moim serwerze deweloperskim, ale nie na serwerze produkcyjnym, był to pierwszy działający na obu. Czyste złoto!
Velojet,
1
To także dla mnie działa znacznie lepiej niż zaakceptowana odpowiedź. dzięki
guillaumepotier
Musiałem dodać kod domeny z wiodącą kropką, niektóre z moich plików cookie mają, niektóre nie, mimo że nie ma odpowiednich subdomen. Ale z tymi zmianami działa dla mnie dobrze, najbardziej kompletna implementacja, jaką próbowałem do tej pory.
Blauelf
67

Po odrobinie frustracji z tego powodu podłączyłem tę funkcję, która spróbuje usunąć nazwane ciasteczko ze wszystkich ścieżek. Po prostu zadzwoń do tego dla każdego z twoich ciasteczek, a powinieneś być bliżej usunięcia każdego ciasteczka niż byłeś wcześniej.

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

Jak zawsze różne przeglądarki mają różne zachowania, ale działało to dla mnie. Cieszyć się.

AnthonyVO
źródło
@TomHammond, To powinno być zupełnie nowe pytanie. Główne problemy dotyczą domeny hostowanej w porównaniu z domeną hostowaną i możliwości kontrolowania hostowanej strony.
AnthonyVO
2
To nadal nie usuwa plików cookie httpOnly. Można je modyfikować tylko przez HTTP.
Sunny R Gupta
14

Jeśli masz dostęp do wtyczki jquery.cookie , możesz usunąć wszystkie pliki cookie w ten sposób:

for (var it in $.cookie()) $.removeCookie(it);
jichi
źródło
Właśnie wypróbowałem to na własnej stronie internetowej, która usunęła wszystkie pliki cookie. Czy @Cerin sama może spróbować wykonać następujący kod w konsoli przed i po usunięciu plików cookie? „for (var it in $ .cookie ()) console.log (it);”
jichi
jichi, czy dodałeś bibliotekę jquery wraz z wtyczką jquery.cookie?
ko1Rn
11

O ile mi wiadomo, nie ma możliwości całkowitego usunięcia jakiegokolwiek pliku cookie ustawionego w domenie. Możesz usunąć plik cookie, jeśli znasz nazwę i skrypt jest w tej samej domenie co plik cookie.

Możesz ustawić wartość pustą, a datę wygaśnięcia gdzieś w przeszłości:

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

Jest tutaj doskonały artykuł na temat manipulowania plikami cookie za pomocą javascript.

ConroyP
źródło
11
Możesz także zrobić document.cookie="username;expires=" + new Date(0).toGMTString()- niewiele różnicy, jeśli plik cookie wygasa 1 sekundę temu lub w 1970 roku
matt b
Dziękuję za artykuł!
tx291
7

Prostsze Szybciej.

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
źródło
2
Nie obsługuje ścieżek.
Scott Smith
6

Odpowiedź pod wpływem zarówno drugiej odpowiedzi tutaj, jak i W3Schools

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

Wydaje się, że działa

edycja: wow prawie dokładnie tak samo jak ciekawe Zacha, jak Stack Overflow umieścił je obok siebie.

edit: nvm, który najwyraźniej był tymczasowy

Jacob David C. Cunningham
źródło
3

Pomyślałem, że podzielę się tą metodą czyszczenia plików cookie. Być może w pewnym momencie może to być pomocne dla kogoś innego.

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
źródło
2

Możesz uzyskać listę, zaglądając do zmiennej document.cookie. Usunięcie ich wszystkich polega na zapętleniu ich wszystkich i wyczyszczeniu ich jeden po drugim.

Sec
źródło
2

Nie wiem, dlaczego pierwsza głosowana odpowiedź nie działa dla mnie.

Jak powiedziała ta odpowiedź :

Nie ma 100% rozwiązania, aby usunąć pliki cookie przeglądarki.

Problem polega na tym, że pliki cookie są jednoznacznie identyfikowane nie tylko po ich kluczowej „nazwie”, ale także „domenie” i „ścieżce”.

Nie znając „domeny” i „ścieżki” pliku cookie, nie można go wiarygodnie usunąć. Informacje te nie są dostępne w document.cookie JavaScript. Nie jest również dostępny w nagłówku HTTP Cookie!

Więc moim pomysłem jest dodanie kontroli wersji plików cookie z pełnym zestawem ustawień, pobierania i usuwania plików 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;';  
}
Mashiro
źródło
dzięki temu zaoszczędziłem godziny. zasługuje na głosowanie. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; usunie pliki cookie.
CruelEngine
2

Mam bardziej wyrafinowany i zorientowany na OOP moduł kontroli plików cookie. Zawiera także deleteAllmetodę usuwania wszystkich istniejących plików cookie. Zwróć uwagę, że ta wersja deleteAllmetody ma ustawienie, path=/które powoduje usunięcie wszystkich plików cookie w bieżącej domenie. Jeśli chcesz usunąć pliki cookie tylko z pewnego zakresu, musisz zaktualizować tę metodę, dodając pathparametr dynamiczny do tej metody.

Jest główna Cookieklasa:

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

Metoda ustawiania plików cookie ( Cookie.set) jest dość złożona, więc rozłożyłem ją na inne klasy. Jest kod tego:

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
źródło
1

Oto prosty kod, aby usunąć wszystkie pliki cookie w 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);
}

Uruchom funkcję, deleteAllCookies()aby usunąć wszystkie pliki cookie.

Shubham Kumar
źródło
1

Podejście funkcjonalne + 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}`;
  }, "");
}

Uwaga: nie obsługuje ścieżek

Stefano Saitta
źródło
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=;';
    }
}
rzymski
źródło
0

Po przetestowaniu prawie zawsze metody wymienionej w wielu stylach przeglądarek na wielu stylach plików cookie, prawie nie ma tu nic, nawet 50%.

Proszę o pomoc w razie potrzeby, ale wrzucę tutaj moje 2 centy. Poniższa metoda rozkłada wszystko i w zasadzie buduje ciąg wartości cookie na podstawie obu elementów ustawień, a także obejmuje krok po kroku kompilację ciągu ścieżki, zaczynając /od oczywiście.

Mam nadzieję, że to pomaga innym i mam nadzieję, że każda krytyka może przybrać formę udoskonalenia tej metody. Na początku chciałem prosty 1-liniowy, jak niektórzy szukali, ale ciasteczka JS są jedną z tych rzeczy, z którymi nie tak łatwo sobie poradzić.

;(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
źródło
Nie działa albo przynajmniej nie dla mnie ... Musiałem usunąć pliki cookie przez HTTP.
adelriosantiago,
0

Jquery:

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

waniliowy 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
źródło
3
Wymaga to wtyczki jQuery Cookie. Biblioteka jQuery nie ma funkcji cookie ().
Ruchira
-1

Znalazłem problem w IE i Edge. Przeglądarki Webkit (Chrome, safari) wydają się bardziej wyrozumiałe. Ustawiając pliki cookie, zawsze ustaw „ścieżkę” na coś, ponieważ domyślnie będzie to strona, która ustawia plik cookie. Jeśli więc spróbujesz wygasnąć na innej stronie bez określenia „ścieżki”, ścieżka nie będzie pasować i nie wygasa. Thedocument.cookieWartość nie pokazuje ścieżkę lub wygaśnięcia cookie, więc nie można czerpać gdzie cookie została ustawiona patrząc na wartości.

Jeśli chcesz wygasnąć pliki cookie z różnych stron, zapisz ścieżkę strony ustawień w wartości pliku cookie, abyś mógł ją później pobrać lub zawsze dołączać "; path=/;"do wartości pliku cookie. Następnie wygasa z dowolnej strony.

Derek Wade
źródło