Jak usunąć wszystkie pliki cookie dla bieżącej domeny za pomocą JavaScript?
Jak usunąć wszystkie pliki cookie dla bieżącej domeny za pomocą JavaScript?
Odpowiedzi:
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";
}
}
Pamiętaj, że ten kod ma dwa ograniczenia:
HttpOnly
ustawioną flagą, ponieważ HttpOnly
flaga wyłącza dostęp Javascript do pliku cookie.Path
wartością. (Dzieje się tak pomimo faktu, że te pliki cookie pojawią się w document.cookie
, ale nie można ich usunąć bez podania tej samej Path
wartości, z jaką zostały ustawione).trim()
dodatkowego miejsca lub split('; ')
(przez „;”), aby działało poprawnie. Zaproponowałem edycję.
Jeśli chcesz szybko wkleić ...
document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
I kod dla bookmarkletu:
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
localStorage
SO window.localStorage.clear()
mogą być pomocne także
I tutaj jest jeden, aby wyczyścić wszystkie pliki cookie we wszystkich ścieżkach i wszystkich wariantach domeny (www.mydomain.com, mydomain.com itp.):
(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();
}
}
})();
Po odrobinie frustracji z tego powodu podłączyłem tę funkcję, która spróbuje usunąć nazwane ciasteczko ze wszystkich ścieżek. Po prostu zadzwoń do tego dla każdego z twoich ciasteczek, a powinieneś być bliżej usunięcia każdego ciasteczka niż byłeś wcześniej.
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 + ';';
}
}
Jak zawsze różne przeglądarki mają różne zachowania, ale działało to dla mnie. Cieszyć się.
Jeśli masz dostęp do wtyczki jquery.cookie , możesz usunąć wszystkie pliki cookie w ten sposób:
for (var it in $.cookie()) $.removeCookie(it);
O ile mi wiadomo, nie ma możliwości całkowitego usunięcia jakiegokolwiek pliku cookie ustawionego w domenie. Możesz usunąć plik cookie, jeśli znasz nazwę i skrypt jest w tej samej domenie co plik cookie.
Możesz ustawić wartość pustą, a datę wygaśnięcia gdzieś w przeszłości:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
Jest tutaj doskonały artykuł na temat manipulowania plikami cookie za pomocą javascript.
document.cookie="username;expires=" + new Date(0).toGMTString()
- niewiele różnicy, jeśli plik cookie wygasa 1 sekundę temu lub w 1970 roku
Prostsze Szybciej.
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";
}
Odpowiedź pod wpływem zarówno drugiej odpowiedzi tutaj, jak i W3Schools
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
Wydaje się, że działa
edycja: wow prawie dokładnie tak samo jak ciekawe Zacha, jak Stack Overflow umieścił je obok siebie.
edit: nvm, który najwyraźniej był tymczasowy
Pomyślałem, że podzielę się tą metodą czyszczenia plików cookie. Być może w pewnym momencie może to być pomocne dla kogoś innego.
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;';
}
Nie wiem, dlaczego pierwsza głosowana odpowiedź nie działa dla mnie.
Jak powiedziała ta odpowiedź :
Nie ma 100% rozwiązania, aby usunąć pliki cookie przeglądarki.
Problem polega na tym, że pliki cookie są jednoznacznie identyfikowane nie tylko po ich kluczowej „nazwie”, ale także „domenie” i „ścieżce”.
Nie znając „domeny” i „ścieżki” pliku cookie, nie można go wiarygodnie usunąć. Informacje te nie są dostępne w document.cookie JavaScript. Nie jest również dostępny w nagłówku HTTP Cookie!
Więc moim pomysłem jest dodanie kontroli wersji plików cookie z pełnym zestawem ustawień, pobierania i usuwania plików 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=/';
usunie pliki cookie.
Mam bardziej wyrafinowany i zorientowany na OOP moduł kontroli plików cookie. Zawiera także deleteAll
metodę usuwania wszystkich istniejących plików cookie. Zwróć uwagę, że ta wersja deleteAll
metody ma ustawienie, path=/
które powoduje usunięcie wszystkich plików cookie w bieżącej domenie. Jeśli chcesz usunąć pliki cookie tylko z pewnego zakresu, musisz zaktualizować tę metodę, dodając path
parametr dynamiczny do tej metody.
Jest główna Cookie
klasa:
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);
}
}
Metoda ustawiania plików cookie ( Cookie.set
) jest dość złożona, więc rozłożyłem ją na inne klasy. Jest kod tego:
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;
}
}
Oto prosty kod, aby usunąć wszystkie pliki cookie w 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);
}
Uruchom funkcję, deleteAllCookies()
aby usunąć wszystkie pliki 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}`;
}, "");
}
Uwaga: nie obsługuje ścieżek
//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=;';
}
}
Po przetestowaniu prawie zawsze metody wymienionej w wielu stylach przeglądarek na wielu stylach plików cookie, prawie nie ma tu nic, nawet 50%.
Proszę o pomoc w razie potrzeby, ale wrzucę tutaj moje 2 centy. Poniższa metoda rozkłada wszystko i w zasadzie buduje ciąg wartości cookie na podstawie obu elementów ustawień, a także obejmuje krok po kroku kompilację ciągu ścieżki, zaczynając /
od oczywiście.
Mam nadzieję, że to pomaga innym i mam nadzieję, że każda krytyka może przybrać formę udoskonalenia tej metody. Na początku chciałem prosty 1-liniowy, jak niektórzy szukali, ale ciasteczka JS są jedną z tych rzeczy, z którymi nie tak łatwo sobie poradzić.
;(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);
}
waniliowy 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
}
Znalazłem problem w IE i Edge. Przeglądarki Webkit (Chrome, safari) wydają się bardziej wyrozumiałe. Ustawiając pliki cookie, zawsze ustaw „ścieżkę” na coś, ponieważ domyślnie będzie to strona, która ustawia plik cookie. Jeśli więc spróbujesz wygasnąć na innej stronie bez określenia „ścieżki”, ścieżka nie będzie pasować i nie wygasa. Thedocument.cookie
Wartość nie pokazuje ścieżkę lub wygaśnięcia cookie, więc nie można czerpać gdzie cookie została ustawiona patrząc na wartości.
Jeśli chcesz wygasnąć pliki cookie z różnych stron, zapisz ścieżkę strony ustawień w wartości pliku cookie, abyś mógł ją później pobrać lub zawsze dołączać "; path=/;"
do wartości pliku cookie. Następnie wygasa z dowolnej strony.
name = ""
, aby usunąć bezimienną wartość.