Очистка всех файлов cookie с помощью JavaScript

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

17 ответов


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 значение. (Это несмотря на то, что эти куки появятся в document.cookie, но вы не можете удалить его без указания того же Path значение, с которым он был установлен.)

один лайнер

в случае, если вы хотите вставить его быстро...

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

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

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


и вот один, чтобы очистить все куки во всех путях и всех вариантах домена (www.mydomain.com, mydomain.com etc):

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

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

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

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

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

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

здесь отличная статья здесь при манипулировании файлами cookie с помощью javascript.


проще. Быстрее.

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

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

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

работает

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

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


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

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

вы можете получить список, заглянув в документ.переменная печенья. Очистка их всех-это просто вопрос зацикливания на всех из них и очистки их один за другим.


вот простой код удалить все cookies в 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() удалить все куки.


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

Примечание: не обрабатывает пути


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

As ответ сказал:

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

проблема в том, что cookies однозначно идентифицируются не только по их ключевому "имени", но и по их "домену" и "пути".

Не зная "домен" и "путь" 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;';  
}

//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=;';
    }
}

после тестирования почти всегда метода, перечисленного в нескольких стилях браузеров на нескольких стилях cookies, я обнаружил, что здесь почти ничего не работает даже 50%.

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

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

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

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
}

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

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