Як видалити всі файли cookie для поточного домену за допомогою JavaScript?
Як видалити всі файли cookie для поточного домену за допомогою JavaScript?
Відповіді:
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
значення, з яким було встановлено.)trim()
додаткове місце або split('; ')
("';"), щоб воно працювало належним чином. Я запропонував редагувати.
Якщо ви хочете швидко вставити його ...
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=/"); }); })();
localStorage
So window.localStorage.clear()
може бути корисним , а також
Ось, щоб очистити всі файли 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();
}
}
})();
Я трохи розчарувавшись цим, я збив цю функцію, яка спробує видалити названий файл 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 + ';';
}
}
Як завжди різні браузери мають різну поведінку, але це працювало для мене. Насолоджуйтесь.
Якщо у вас є доступ до плагіна jquery.cookie , ви можете видалити всі файли cookie таким чином:
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.
document.cookie="username;expires=" + new Date(0).toGMTString()
- не велика різниця, якщо термін cookie закінчиться 1 секунду тому або в 1970 році
Простіше. Швидше.
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;';
});
Здається, працює
редагувати: вау майже точно так само, як цікаво Заку, як Stack Overflow поставив їх поруч.
edit: nvm, мабуть, тимчасовий
Думаю, я поділюсь цим методом очищення файлів 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;';
}
Я не знаю, чому перша проголосована відповідь не працює для мене.
Як сказано в цій відповіді :
Немає стовідсоткового рішення для видалення файлів 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 expireTime = now.getTime();
now.setTime(expireTime);
document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/';
видалить файли cookie.
У мене є кілька більш складних і орієнтованих на ООП модулів управління файлами 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;
}
}
Ось простий код для видалення всіх файлів 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.
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}`;
}, "");
}
Примітка. Не обробляє контури
//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=;';
}
}
Після тестування майже будь-якого методу, перерахованого в декількох стилях браузерів на декількох стилях 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;
}
}
})();
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. Веб-браузери (Chrome, сафарі) здаються більш прощаючими. Встановлюючи файли cookie, завжди встановлюйте "шлях" до чогось, тому що за замовчуванням буде сторінка, на якій встановлено файл cookie. Тож якщо ви спробуєте закінчити його на іншій сторінці, не вказуючи "шлях", шлях не збігається і він не закінчується. Thedocument.cookie
Значення не вказує шлях або закінчення терміну для печива, так що ви не можете отримати , де куки був встановлений , дивлячись на значення.
Якщо вам потрібно закінчити термін cookie з різних сторінок, збережіть шлях сторінки налаштування у значенні файлу cookie, щоб ви могли витягнути його пізніше або завжди додати "; path=/;"
до значення cookie. Тоді термін дії закінчується з будь-якої сторінки.
name = ""
, щоб стерти безіменне значення.