Comment supprimez-vous tous les cookies du domaine actuel en utilisant JavaScript?
Comment supprimez-vous tous les cookies du domaine actuel en utilisant JavaScript?
Réponses:
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
indicateur défini, car l' HttpOnly
indicateur désactive l'accès de Javascript au cookie.Path
valeur. (Ceci malgré le fait que ces cookies apparaîtront dans document.cookie
, mais vous ne pouvez pas les supprimer sans spécifier la même Path
valeur avec laquelle ils ont été définis.)trim()
l'espace supplémentaire ou split('; ')
(par ';') pour le faire fonctionner correctement. J'ai proposé un montage.
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 d'un bookmarklet:
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
localStorage
donc window.localStorage.clear()
peuvent également être utiles
Et voici un pour effacer tous les cookies dans tous les chemins et toutes les variantes du domaine (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();
}
}
})();
Après un peu de frustration avec moi-même, j'ai assimilé cette fonction qui tentera de supprimer un cookie nommé de tous les chemins. Appelez simplement cela pour chacun de vos cookies et vous devriez être plus près de supprimer tous les cookies que vous étiez avant.
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.
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);
Pour autant que je sache, il n'y a aucun moyen de supprimer une couverture d'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 sur 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 des cookies en utilisant javascript.
document.cookie="username;expires=" + new Date(0).toGMTString()
- pas beaucoup de différence si le cookie expire il y a 1 seconde ou en 1970
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 par la deuxième réponse ici et W3Schools
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
Semble fonctionner
edit: wow presque exactement la même chose que Zach intéressant de voir comment Stack Overflow les a mis côte à côte.
edit: nvm qui était temporaire apparemment
Je pensais partager cette méthode pour effacer les cookies. Peut-être que cela peut ê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 le disait cette réponse :
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 "nom" de clé, mais aussi par leur "domaine" et leur "chemin".
Sans connaître le «domaine» et le «chemin» d'un cookie, vous ne pouvez pas le supprimer de manière fiable. Ces informations ne sont pas disponibles via le document.cookie de JavaScript. Il n'est pas non plus disponible via l'en-tête HTTP Cookie!
Donc, mon idée est d'ajouter un contrôle de version des cookies avec l'ensemble complet de paramètres, obtenir, supprimer les 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;';
}
let expireTime = now.getTime();
now.setTime(expireTime);
document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/';
supprimera les cookies.
J'ai un module de contrôle des cookies plus sophistiqué et orienté OOP. Il contient également une deleteAll
méthode pour effacer tous les cookies existants. Notez que cette version de la deleteAll
méthode a un paramètre path=/
qui provoque la suppression de tous les cookies dans le domaine actuel. Si vous devez supprimer les cookies uniquement d'une certaine portée, vous devrez mettre à niveau cette méthode en ajoutant un path
paramètre dynamique à cette méthode.
Il y a une Cookie
classe principale :
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 des cookies ( Cookie.set
) est plutôt complexe, je l'ai donc décomposée en une autre classe. Il y a du 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;
}
}
Voici un code simple pour 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}`;
}, "");
}
Remarque: 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 toutes les méthodes répertoriées dans plusieurs styles de navigateurs sur plusieurs styles de cookies, j'ai trouvé que presque rien ici ne fonctionnait même à 50%.
Veuillez aider à corriger au besoin, mais je vais jeter mes 2 cents ici. La méthode suivante décompose tout et construit essentiellement la chaîne de valeur du cookie sur la base des deux paramètres, ainsi que l'inclusion d'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 aide les autres et j'espère que toute critique pourra venir sous la forme de perfectionner cette méthode. Au début, je voulais un simple liner comme certains autres le souhaitaient, mais les cookies JS font partie de ces choses qui ne sont pas si faciles à 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);
}
vanille 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
}
J'ai trouvé un problème dans IE et Edge. Les navigateurs Webkit (Chrome, safari) semblent plus indulgents. Lors de la configuration des cookies, définissez toujours le "chemin" sur quelque chose, car la valeur par défaut sera la page qui a défini le cookie. Donc, si vous essayez de l'exirer sur une autre page sans spécifier le "chemin", le chemin ne correspondra pas et n'expirera pas. La document.cookie
valeur n'affiche pas le chemin ou l'expiration d'un cookie, vous ne pouvez donc pas déterminer où le cookie a été défini en regardant la valeur.
Si vous devez expirer les cookies de différentes pages, enregistrez le chemin de la page de configuration dans la valeur du cookie afin de pouvoir le retirer plus tard ou toujours l'ajouter "; path=/;"
à la valeur du cookie. Ensuite, il expirera de n'importe quelle page.
name = ""
place, pour effacer la valeur sans nom.