Menghapus semua cookie dengan JavaScript

288

Bagaimana Anda menghapus semua cookie untuk domain saat ini menggunakan JavaScript?

beruang kutub
sumber

Jawaban:

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

Perhatikan bahwa kode ini memiliki dua batasan:

  • Itu tidak akan menghapus cookie dengan HttpOnlyset flag, karena HttpOnlyflag menonaktifkan akses Javascript ke cookie.
  • Itu tidak akan menghapus cookie yang telah ditetapkan dengan suatu Pathnilai. (Ini terlepas dari kenyataan bahwa cookie itu akan muncul document.cookie, tetapi Anda tidak dapat menghapusnya tanpa menentukan nilai yang sama Pathdengan yang ditetapkan.)
Robert J. Walker
sumber
5
Bagus sekali, tetapi setelah bereksperimen, saya menemukan bahwa sebuah situs hanya dapat memiliki satu cookie tanpa =, dan kemudian itu adalah cookie tanpa nama, Anda mendapatkan nilainya sebenarnya. Jadi jika eqPos == 1, Anda harus melakukannya name = "", untuk menghapus nilai tanpa nama.
PhiLho
59
Awas! Jika cookie Anda dikonfigurasikan untuk menggunakan komponen jalur atau domain, cuplikan praktis ini tidak akan berfungsi.
Dan Fabulich
1
Benar. Cuplikan dapat dimodifikasi untuk meminta detail itu kepada Anda; tetapi ini bekerja untuk sebagian besar kasus.
Robert J. Walker
7
Bagaimana ini akan dimodifikasi untuk memasukkan info jalur atau domain?
VUELA
2
Paling tidak di cookie Chrome dipisahkan oleh ";", jadi kami harus ke trim()ruang tambahan atau split('; ')(oleh ';') untuk membuatnya berfungsi dengan baik. Saya telah mengusulkan hasil edit.
Daniel Kucal
124

Satu liner

Jika Anda ingin menempelkannya dengan cepat ...

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

Dan kode untuk bookmarklet:

javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Craig Smedley
sumber
1
Beberapa cookie situs web yang localStoragewindow.localStorage.clear()
bertahan
75

Dan ini satu untuk menghapus semua cookie di semua jalur dan semua varian domain (www.mydomain.com, mydomain.com dll):

(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
sumber
10
ini harus menjadi jawaban terbaik
Kanan Farzali
3
Yang ini berfungsi untuk saya dalam chrome, sedangkan jawaban yang diterima tidak
Orny
2
Cemerlang! Setelah mencoba beberapa orang lain yang bekerja pada server dev saya tetapi tidak pada server produksi, ini adalah yang pertama bekerja pada keduanya Emas murni!
Velojet
1
Bagi saya ini juga lebih baik daripada jawaban yang diterima. terima kasih
guillaumepotier
Harus menambahkan kode untuk domain dengan titik terkemuka, beberapa cookie saya memilikinya, beberapa tidak, meskipun tidak ada subdomain yang relevan. Tetapi dengan perubahan itu, ia bekerja dengan baik untuk saya, implementasi terlengkap yang saya coba sejauh ini.
Blauelf
67

Setelah sedikit frustrasi dengan ini saya sendiri mengetuk fungsi ini yang akan mencoba untuk menghapus cookie bernama dari semua jalur. Panggil saja ini untuk setiap cookie Anda dan Anda harus lebih dekat untuk menghapus setiap cookie dari sebelumnya.

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

Seperti biasa browser yang berbeda memiliki perilaku yang berbeda tetapi ini bekerja untuk saya. Nikmati.

AnthonyVO
sumber
@ TomHammond, Itu seharusnya pertanyaan yang sama sekali baru. Masalah utama ada di sekitar domain yang dihosting vs domain hosting dan kemampuan Anda untuk mengontrol halaman yang dihosting.
AnthonyVO
2
Ini masih tidak akan menghapus cookie httpOnly. Mereka hanya dapat dimodifikasi melalui HTTP.
Sunny R Gupta
14

Jika Anda memiliki akses ke plugin jquery.cookie , Anda dapat menghapus semua cookie dengan cara ini:

for (var it in $.cookie()) $.removeCookie(it);
jichi
sumber
Saya baru saja mencobanya di situs web saya sendiri, yang menghapus semua cookie. Bisakah @Cerin sama mencoba menjalankan kode berikut di konsol sebelum dan sesudah menghapus cookie? "for (var dalam $ .cookie ()) console.log (it);"
jichi
jichi apakah Anda menyertakan perpustakaan jquery bersama dengan plugin jquery.cookie?
ko1Rn
11

Sejauh yang saya tahu tidak ada cara untuk menghapus semua cookie yang ditetapkan di domain. Anda dapat menghapus cookie jika Anda tahu nama dan jika skrip berada pada domain yang sama dengan cookie.

Anda dapat mengatur nilai menjadi kosong dan tanggal kedaluwarsa di suatu tempat di masa lalu:

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

Ada artikel yang sangat bagus di sini tentang memanipulasi cookie menggunakan javascript.

ConroyP
sumber
11
Anda juga dapat melakukannya document.cookie="username;expires=" + new Date(0).toGMTString()- tidak banyak perbedaan jika cookie berakhir 1 detik yang lalu atau pada tahun 1970
matt b
Terima kasih atas artikelnya!
tx291
7

Lebih sederhana. Lebih cepat.

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
sumber
2
Tidak menangani jalur.
Scott Smith
6

Jawaban dipengaruhi oleh jawaban kedua di sini dan W3Schools

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

Tampaknya bekerja

sunting: wow hampir persis sama dengan Zach yang menarik bagaimana Stack Overflow menempatkan mereka di samping satu sama lain.

sunting: nvm yang tampaknya sementara

Yakub David C. Cunningham
sumber
3

Kupikir aku akan berbagi metode ini untuk menghapus cookie. Mungkin itu mungkin bermanfaat untuk orang lain di beberapa titik.

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
sumber
2

Anda bisa mendapatkan daftar dengan melihat variabel document.cookie. Membersihkan mereka semua hanya masalah perulangan mereka semua dan membersihkan mereka satu per satu.

Detik
sumber
2

Saya tidak tahu mengapa jawaban pilihan pertama tidak berhasil untuk saya.

Seperti yang dikatakan jawaban ini :

Tidak ada solusi 100% untuk menghapus cookie browser.

Masalahnya adalah bahwa cookie diidentifikasi secara unik bukan hanya dengan "nama" kunci mereka tetapi juga "domain" dan "jalur" mereka.

Tanpa mengetahui "domain" dan "jalur" cookie, Anda tidak dapat menghapusnya dengan andal. Informasi ini tidak tersedia melalui dokumen JavaScript.cookie. Itu juga tidak tersedia melalui tajuk Cookie HTTP!

Jadi ide saya adalah menambahkan kontrol versi Cookie dengan set lengkap pengaturan, mendapatkan, menghapus 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
sumber
ini menghemat waktu saya. layak mendapatkan upvote. `` let now = Date baru (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; akan menghapus cookie.
CruelEngine
2

Saya memiliki beberapa modul kontrol cookie yang lebih canggih dan berorientasi OOP. Ini juga berisi deleteAllmetode untuk menghapus semua cookie yang ada. Perhatikan bahwa versi deleteAllmetode ini memiliki pengaturan path=/yang menyebabkan penghapusan semua cookie dalam domain saat ini. Jika Anda hanya perlu menghapus cookie dari beberapa ruang lingkup, Anda harus meningkatkan metode ini dengan menambahkan pathparameter dinamis saya ke metode ini.

Ada Cookiekelas utama :

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

Metode cookie setter ( Cookie.set) agak rumit sehingga saya mendekomposisikannya ke kelas lain. Ada kode yang ini:

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
sumber
1

Berikut adalah kode sederhana untuk menghapus semua cookie di 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);
}

Jalankan fungsi deleteAllCookies()untuk menghapus semua cookie.

Shubham Kumar
sumber
1

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

Catatan: Tidak menangani jalur

Stefano Saitta
sumber
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=;';
    }
}
Roma
sumber
0

Setelah menguji hampir semua metode yang terdaftar dalam berbagai gaya browser pada banyak gaya cookie, saya menemukan hampir tidak ada yang bekerja di sini bahkan 50%.

Tolong bantu mengoreksi sesuai kebutuhan, tapi saya akan melemparkan 2 sen saya di sini. Metode berikut memecah semuanya dan pada dasarnya membangun string nilai cookie berdasarkan pada kedua bagian pengaturan serta termasuk langkah demi langkah membangun string path, dimulai dengan/ tentu saja.

Semoga ini bisa membantu orang lain dan saya harap kritik apa pun bisa datang dalam bentuk menyempurnakan metode ini. Pada awalnya saya ingin 1-liner sederhana seperti yang dicari beberapa orang lain, tetapi cookie JS adalah salah satu hal yang tidak mudah ditangani.

;(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
sumber
Tidak berfungsi, atau setidaknya tidak untuk saya ... Saya harus menghapus cookie melalui HTTP.
adelriosantiago
0

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
}
sureshvignesh
sumber
3
Ini membutuhkan plugin jQuery Cookie. Pustaka jQuery tidak memiliki fungsi cookie ().
Ruchira
-1

Saya menemukan masalah di IE dan Edge. Browser Webkit (Chrome, safari) tampaknya lebih mudah memaafkan. Saat mengatur cookie, selalu atur "path" ke sesuatu, karena default akan menjadi halaman yang mengatur cookie. Jadi, jika Anda mencoba untuk kedaluwarsa pada halaman yang berbeda tanpa menentukan "path", path tidak akan cocok dan tidak akan kedaluwarsa. Itudocument.cookie nilai tidak menunjukkan jalan atau kedaluwarsa untuk cookie, sehingga Anda tidak dapat memperoleh mana cookie ditetapkan dengan melihat nilai.

Jika Anda perlu kedaluwarsa cookie dari halaman yang berbeda, simpan jalur halaman pengaturan dalam nilai cookie sehingga Anda dapat menariknya nanti atau selalu menambahkan "; path=/;"nilai cookie. Maka akan kedaluwarsa dari halaman mana pun.

Derek Wade
sumber