Очистить все куки с помощью JavaScript

289

Как удалить все файлы 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";
    }
}

Обратите внимание, что этот код имеет два ограничения:

  • Он не будет удалять куки с HttpOnlyустановленным флагом, так как этот HttpOnlyфлаг отключает доступ Javascript к куки.
  • Он не удаляет файлы cookie, для которых установлено Pathзначение. (Это несмотря на то, что эти файлы cookie появятся в document.cookie, но вы не можете удалить их, не указав то же Pathзначение, с которым они были установлены.)
Роберт Дж. Уокер
источник
5
Хороший, но после экспериментов я обнаружил, что на сайте может быть только один файл cookie без =, и тогда это безымянный файл cookie, вы на самом деле получаете его значение. Так что если eqPos == 1, вы должны name = ""вместо этого стереть безымянное значение.
PhiLho
59
Осторожно! Если ваши файлы cookie настроены на использование компонента пути или домена, этот удобный фрагмент не будет работать.
Дан Фабулич,
1
Правда. Фрагмент может быть изменен, чтобы спросить вас об этих деталях; но это работает для большинства случаев.
Роберт Дж. Уокер,
7
Как это можно изменить, чтобы включить информацию о пути или домене?
ВУЭЛА
2
По крайней мере, в Chrome cookie-файлы разделены символом «;», поэтому нам нужно 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
Некоторые постоянные веб-сайты localStoragewindow.localStorage.clear()
создают
77

И вот один из них, чтобы очистить все куки на всех путях и во всех вариантах домена (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
это должен быть лучший ответ
Kanan
3
Этот работает для меня в Chrome, в то время как принятый ответ не работает
Orny
2
Brilliant! После попытки нескольких других, которые работали на моем сервере разработки, но не на производственном сервере, это было первым, чтобы работать на обоих. Чистое золото!
Velojet
1
Это также для меня работает намного лучше, чем принятый ответ. спасибо
guillaumepotier
Пришлось добавить код для домена с лидирующей точкой, некоторые из моих файлов cookie имеют его, а некоторые нет, хотя соответствующих поддоменов нет. Но с этими изменениями это работает хорошо для меня, самая полная реализация, которую я когда-либо пробовал.
Блауэльф
67

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

Как всегда, разные браузеры ведут себя по-разному, но это работает для меня. Наслаждаться.

AnthonyVO
источник
@ TomHammond, это должен быть совершенно новый вопрос. Основные проблемы связаны с размещенным доменом против хостингового домена и вашей способностью контролировать размещенную страницу.
AnthonyVO
2
Это все равно не удалит файлы cookie httpOnly. Они могут быть изменены только через HTTP.
Солнечный R Гупта
14

Если у вас есть доступ к плагину jquery.cookie , вы можете удалить все файлы cookie следующим образом:

for (var it in $.cookie()) $.removeCookie(it);
Jichi
источник
Я только что попробовал это на моем собственном сайте, который удалил все куки. Может ли @Cerin sama попытаться выполнить следующий код в консоли до и после очистки файлов cookie? "for (var в $ .cookie ()) console.log (it);"
Джичи
jichi Вы включили библиотеку jquery вместе с плагином jquery.cookie?
ko1Rn
11

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

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

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

Здесь есть отличная статья о том, как манипулировать cookie-файлами с помощью JavaScript.

ConroyP
источник
11
Вы также можете просто сделать document.cookie="username;expires=" + new Date(0).toGMTString()- не большая разница, если срок действия файла cookie истекает 1 секунду назад или в 1970 году
Мэтт b
Спасибо за статью!
tx291
7

Simpler. Быстрее.

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 помещает их рядом друг с другом.

редактировать: NVM, который был временным, по-видимому

Джейкоб Дэвид С. Каннингем
источник
3

Думаю, я бы поделился этим методом для очистки куки. Возможно, это может быть полезно для кого-то еще в какой-то момент.

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. Очистка их всех - это просто цикл по всем из них и очистка их один за другим.

Sec
источник
2

Я не знаю, почему первый проголосовавший ответ не работает для меня.

Как сказал этот ответ :

Не существует 100% решения для удаления файлов cookie браузера.

Проблема заключается в том, что файлы cookie однозначно идентифицируются не только по ключу «имя», но также по «домену» и «пути».

Не зная «домен» и «путь» куки, вы не сможете надежно удалить его. Эта информация не доступна через документ document.cookie в JavaScript. Он также недоступен через заголовок HTTP Cookie!

Поэтому моя идея состоит в том, чтобы добавить контроль версий 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;';  
}
Mashiro
источник
это сэкономило мне часы. заслуживает upvote. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; удалит куки.
CruelEngine
2

У меня есть более сложный и ориентированный на ООП модуль управления файлами cookie. Он также содержит deleteAllметод для очистки всех существующих файлов cookie. Обратите внимание, что в этой версии deleteAllметода есть настройка, path=/которая вызывает удаление всех файлов 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()чтобы очистить все куки.

Шубхам Кумар
источник
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-лайнер, как искали некоторые другие, но JS-cookie - это одна из тех вещей, с которыми не так легко разобраться.

;(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
источник
Не работает или, по крайней мере, не для меня ... Я должен был удалить куки по 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
}
sureshvignesh
источник
3
Для этого требуется плагин jQuery Cookie. Библиотека jQuery не имеет функции cookie ().
Ruchira
-1

Я нашел проблему в IE и Edge. Браузеры Webkit (Chrome, Safari) кажутся более щадящими. При настройке файлов cookie всегда устанавливайте «путь» к чему-либо, поскольку по умолчанию будет использоваться страница, на которой установлен файл cookie. Поэтому, если вы попытаетесь удалить его на другой странице, не указав «путь», путь не будет совпадать и срок его действия не истечет. document.cookieЗначение не показывает путь или истечения срока для печенья, так что вы не можете получить , где куки был установлен , глядя на значение.

Если вам нужно удалить файлы cookie с разных страниц, сохраните путь к странице настроек в значении cookie, чтобы вы могли извлечь его позже или всегда добавить "; path=/;"к значению cookie. Тогда он истекает с любой страницы.

Дерек Уэйд
источник