Очистка всех куки с помощью JavaScript - PullRequest
238 голосов
/ 07 октября 2008

Как удалить все файлы cookie для текущего домена с помощью JavaScript?

Ответы [ 18 ]

255 голосов
/ 07 октября 2008
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, с которым они были установлены.)
100 голосов
/ 09 декабря 2014

Один лайнер

Если вы хотите быстро вставить его ...

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=/"); }); })();
60 голосов
/ 04 мая 2011

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

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

45 голосов
/ 27 октября 2015

И вот один из них, чтобы очистить все куки на всех путях и во всех вариантах домена (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();
        }
    }
})();
15 голосов
/ 06 января 2014

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

for (var it in $.cookie()) $.removeCookie(it);
11 голосов
/ 07 октября 2008

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

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

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

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

5 голосов
/ 21 ноября 2013

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";    
}
5 голосов
/ 24 мая 2017

Ответ под влиянием как второго ответа здесь, так и W3Schools

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

Кажется, работает

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

edit: nvm, который был временным, по-видимому,

3 голосов
/ 23 июля 2013

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

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 голосов
/ 01 марта 2019

У меня есть более сложный и OOP-ориентированный модуль управления 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...