Comment supprimez-vous tous les cookies du domaine actuel à l'aide de 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";
}
}
Notez que ce code a deux limitations:
HttpOnly
, car le drapeau HttpOnly
désactive l'accès de Javascript au cookie.Path
. (Ceci en dépit du fait que ces cookies apparaîtront dans document.cookie
, mais vous ne pouvez pas le supprimer sans spécifier la même valeur Path
avec laquelle il a été défini.)Au cas où vous voudriez le coller rapidement ...
document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
Et le code pour un bookmarklet:
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Après un peu de frustration avec moi-même, j'ai combiné cette fonction qui tentera de supprimer un cookie nommé de tous les chemins. Appelez simplement ceci pour chacun de vos cookies et vous devriez être plus proche de la suppression de chaque 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 + ';';
}
}
Comme toujours, les différents navigateurs ont un comportement différent, mais cela a fonctionné pour moi. Prendre plaisir.
Et voici un moyen pour effacer tous les cookies dans tous les chemins et toutes les variantes du domaine (www.mondomaine.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();
}
}
})();
Si vous avez accès au plugin jquery.cookie , vous pouvez effacer tous les cookies de cette façon:
for (var it in $.cookie()) $.removeCookie(it);
Autant que je sache, il est impossible de supprimer totalement un cookie défini sur le domaine. Vous pouvez effacer un cookie si vous connaissez le nom et si le script se trouve sur le même domaine que le cookie.
Vous pouvez définir la valeur vide et la date d'expiration quelque part dans le passé:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
Il y a un excellent article ici sur la manipulation de cookies en utilisant javascript.
Plus simple. Plus rapide.
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";
}
Une réponse influencée à la fois par la deuxième réponse ici et par W3Schools
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
Semble travailler
edit: wow, presque exactement comme Zach est intéressant de voir comment Stack Overflow les a placés les uns à côté des autres.
edit: nvm qui était temporaire apparemment
Je pensais partager cette méthode pour effacer les cookies. Peut-être que cela pourrait être utile pour quelqu'un d'autre à un moment donné.
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;';
}
Je ne sais pas pourquoi la première réponse votée ne fonctionne pas pour moi.
Comme cette réponse dit:
Il n'y a pas de solution à 100% pour supprimer les cookies du navigateur.
Le problème est que les cookies sont identifiés de manière unique non seulement par leur clé "nom" mais également par leur "domaine" et "chemin".
Sans connaître le "domaine" et le "chemin" d'un cookie, vous ne pouvez pas le supprimer de manière fiable. Cette information n'est pas disponible via le document.cookie de JavaScript. Ce n'est pas disponible non plus via l'en-tête HTTP Cookie!
Donc, mon idée est d’ajouter un contrôle de version de cookie avec l’ensemble des paramètres permettant d’obtenir et de supprimer des cookies:
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;';
}
J'ai un module de contrôle des cookies plus sophistiqué et orienté POO. Il contient également la méthode deleteAll
pour effacer tous les cookies existants. Notez que cette version de la méthode deleteAll
a le paramètre path=/
qui entraîne la suppression de tous les cookies dans le domaine actuel. Si vous ne devez supprimer les cookies que d'une certaine portée, vous devrez mettre à niveau cette méthode en ajoutant le paramètre dynamic path
à cette méthode.
Il y a la classe principale 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);
}
}
La méthode de définition de cookie (Cookie.set
) est assez complexe, alors je l'ai décomposée en une autre classe. Il y a un code de celui-ci:
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;
}
}
Vous pouvez obtenir une liste en consultant la variable document.cookie. Tout effacer consiste simplement à les boucler et à les effacer un par un.
Voici un code simple à supprimer tous les cookies en 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);
}
Exécutez la fonction deleteAllCookies()
pour effacer tous les cookies.
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}`;
}, "");
}
Note: Ne gère pas les chemins
//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=;';
}
}
Après avoir testé presque toujours la méthode répertoriée dans plusieurs styles de navigateurs sur plusieurs styles de cookies, j'ai constaté que presque rien ne fonctionne ici même à 50%.
S'il vous plaît aider à corriger si nécessaire, mais je vais jeter mes 2 cents ici. La méthode suivante décompose tout et construit en gros la chaîne de valeur du cookie en fonction des éléments de configuration et en incluant une construction étape par étape de la chaîne de chemin d'accès, en commençant par /
bien sûr.
J'espère que cela aidera les autres et j'espère que toute critique viendra sous forme de perfectionner cette méthode. Au début, je voulais un simple 1-liner comme d'autres, mais les cookies JS font partie de ces problèmes difficiles à gérer.
;(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);
}
Vanilla 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
}