Очищення всіх файлів cookie за допомогою JavaScript


Відповіді:


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

Зауважте, що цей код має два обмеження:

  • Він не видалить файли cookie із HttpOnlyвстановленим прапором, якHttpOnly прапор відключає доступ Javascript до файлу cookie.
  • Він не видалить файли cookie, які були встановлені зі Pathзначенням. (Це незважаючи на те, що ці файли cookie з’являться в document.cookie, але ви не можете їх видалити, не вказавши те саме Pathзначення, з яким було встановлено.)

5
Хороший, але, експериментуючи, я виявив, що на сайті може бути один файл cookie без =, і тоді це безіменний файл cookie, ви фактично отримуєте його значення. Отже, якщо eqPos == 1, вам слід зробити це name = "", щоб стерти безіменне значення.
PhiLho

59
Остерігайся! Якщо ваші файли cookie налаштовані на використання шляху або компонента домену, цей зручний фрагмент не працюватиме.
Дан Фабуліч

1
Правда. Фрагмент можна змінити, щоб запитати вас про ці деталі; але це працює в більшості випадків.
Роберт Дж. Уокер

7
Як це змінити, щоб включити інформацію про шлях або домен?
ВУЕЛА

2
Принаймні, у файлах cookie Chrome розділені знаком ";", тому нам належить trim()додаткове місце або split('; ')("';"), щоб воно працювало належним чином. Я запропонував редагувати.
Даніель Кукал

124

Один лайнер

Якщо ви хочете швидко вставити його ...

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

І код для закладки:

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

1
Деякі веб - сайти Стійкі резервного копіювання печиво в localStorageSo window.localStorage.clear()може бути корисним , а також
Klesun

75

Ось, щоб очистити всі файли cookie у всіх шляхах та всіх варіантах домену (www.mydomain.com, mydomain.com тощо):

(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
це має бути найкращою відповіддю
Канан Фарзалі

3
Цей працює для мене в хромі, тоді як прийнята відповідь не відповідає
Орні

2
Блискуче! Після спробу декількох інших, які працювали на моєму сервісі розробників, але не на виробничому сервері, це було першим, хто працював над обома. Чисте золото!
Велоджет

1
Це також для мене працює набагато краще, ніж прийнята відповідь. дякую
guillaumepotier

Довелося додати код домену з провідною крапкою, деякі мої файли cookie мають, а деякі ні, навіть якщо немає відповідних субдоменів. Але з тими змінами це добре працює для мене, найповніша реалізація, яку я намагався поки що.
Блауельф

67

Я трохи розчарувавшись цим, я збив цю функцію, яка спробує видалити названий файл cookie з усіх шляхів. Просто зателефонуйте до кожного свого файлу cookie, і ви повинні бути ближче до видалення кожного файлу 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 + ';';
    }
}

Як завжди різні браузери мають різну поведінку, але це працювало для мене. Насолоджуйтесь.


@TomHammond, Це має бути абсолютно новим питанням. Основні проблеми стосуються розміщеного домену та хостингу домену та вашої можливості контролювати розміщену сторінку.
АнтонійВО

2
Це все одно не видалить файли cookie httpOnly. Вони можуть бути змінені лише через HTTP.
Сонячний Р Гупта

14

Якщо у вас є доступ до плагіна jquery.cookie , ви можете видалити всі файли cookie таким чином:

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

Я просто спробував це на власному веб-сайті, який видалив усі файли cookie. Чи може @Cerin сама спробувати виконати наступний код у консолі до та після очищення файлів cookie? "для (var it у $ .cookie ()) console.log (it);"
jichi

jichi Ви включили бібліотеку jquery поряд із плагіном jquery.cookie?
ko1Rn

11

Наскільки я знаю, немає жодного способу зробити повне видалення файлів cookie з домену. Ви можете очистити файл cookie, якщо ви знаєте ім'я та якщо сценарій у тому ж домені, що і cookie.

Ви можете встановити значення порожнім, а термін придатності - десь у минулому:

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

Тут чудова стаття про маніпулювання файлами cookie за допомогою JavaScript.


11
Ви також можете просто зробити document.cookie="username;expires=" + new Date(0).toGMTString()- не велика різниця, якщо термін cookie закінчиться 1 секунду тому або в 1970 році
мат b

Дякую за статтю!
tx291

7

Простіше. Швидше.

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
Не обробляє контури.
Скотт Сміт

6

На відповідь вплинули і друга відповідь тут, і W3Schools

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

Здається, працює

редагувати: вау майже точно так само, як цікаво Заку, як Stack Overflow поставив їх поруч.

edit: nvm, мабуть, тимчасовий


3

Думаю, я поділюсь цим методом очищення файлів cookie. Можливо, це може бути корисним для когось іншого в якийсь момент.

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

Ви можете отримати список, переглянувши змінну document.cookie. Очищення їх усіх - лише питання прокручування всіх і очищення їх одна за одною.


2

Я не знаю, чому перша проголосована відповідь не працює для мене.

Як сказано в цій відповіді :

Немає стовідсоткового рішення для видалення файлів cookie браузера.

Проблема полягає в тому, що файли cookie однозначно ідентифікуються не лише за їх ключовим "ім'ям", але і за їх "доменом" і "шляхом".

Не знаючи "домену" та "шляху" файлу cookie, ви не можете надійно його видалити. Ця інформація недоступна через JavaScript document.cookie JavaScript. Він також недоступний через заголовок файлів cookie HTTP!

Тож моя ідея полягає в тому, щоб додати контроль версії Cookie з повним набором налаштувань, отримання, видалення файлів 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;';  
}

це врятувало мені години. заслуговує на підвищення. `` Let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; видалить файли cookie.
CruelEngine

2

У мене є кілька більш складних і орієнтованих на ООП модулів управління файлами cookie. Він також містить deleteAllметод очищення всіх існуючих файлів cookie. Зауважте, що у цій версії deleteAllметоду є налаштування, path=/яке викликає видалення всіх файлів cookie у поточному домені. Якщо вам потрібно видалити файли cookie лише з певної області, вам доведеться оновити цей метод, додавши pathдо цього методу динамічний параметр.

Є основний 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);
    }
}

Метод встановлення файлів cookie ( Cookie.set) досить складний, тому я розклав його на інший клас. Код цього:

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

Ось простий код для видалення всіх файлів cookie в 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);
}

Запустіть функцію, deleteAllCookies()щоб очистити всі файли cookie.


1

Функціональний підхід + 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}`;
  }, "");
}

Примітка. Не обробляє контури


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

Після тестування майже будь-якого методу, перерахованого в декількох стилях браузерів на декількох стилях cookie, я виявив, що майже нічого тут не працює навіть на 50%.

Будь ласка, допоможіть виправити за потреби, але я збираюся кинути свої 2 центи сюди. Наступний метод розбиває все і в основному будує рядок значення файлу cookie на основі обох фрагментів налаштування, а також включає покрокове складання рядка шляху, починаючи з/ звичайно,.

Сподіваюся, це допомагає іншим, і я сподіваюся, що будь-яка критика може виникнути у формі вдосконалення цього методу. Спочатку я хотів простий 1-лайнер, як прагнули деякі інші, але файли cookie JS - одна з тих речей, з якими не так легко вирішуватись.

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

Не працює або, принаймні, не для мене ... Мені довелося видалити файли cookie за допомогою HTTP.
adelriosantiago

0

Jquery:

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

ванільний 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
Для цього потрібен плагін jQuery Cookie. У бібліотеці jQuery немає функції cookie ().
Ручіра

-1

Я знайшов проблему в IE та Edge. Веб-браузери (Chrome, сафарі) здаються більш прощаючими. Встановлюючи файли cookie, завжди встановлюйте "шлях" до чогось, тому що за замовчуванням буде сторінка, на якій встановлено файл cookie. Тож якщо ви спробуєте закінчити його на іншій сторінці, не вказуючи "шлях", шлях не збігається і він не закінчується. Thedocument.cookieЗначення не вказує шлях або закінчення терміну для печива, так що ви не можете отримати , де куки був встановлений , дивлячись на значення.

Якщо вам потрібно закінчити термін cookie з різних сторінок, збережіть шлях сторінки налаштування у значенні файлу cookie, щоб ви могли витягнути його пізніше або завжди додати "; path=/;"до значення cookie. Тоді термін дії закінчується з будь-якої сторінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.