使用 JavaScript 清除所有 cookie
Clearing all cookies with JavaScript
如何使用JavaScript删除当前域的所有cookie?
function deleteAllCookies() {
const cookies = document.cookie.split(";");
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i];
const eqPos = cookie.indexOf("=");
const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
}
}
请注意,此代码有两个限制:
- 它不会删除设置了
HttpOnly
标志的cookie,因为HttpOnly
标志会禁用Javascript对cookie的访问。 - 它不会删除已设置
Path
值的 Cookie。(尽管这些 cookie 将显示在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=/"); }); })();
一个可以清除所有路径和域的所有变体(www.mydomain.example
,mydomain.example
等)中的所有cookie:
(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 + ';';
}
}
与往常一样,不同的浏览器有不同的行为,但这对我有用。享受。
以下代码将删除当前域中的所有 cookie 和所有尾随子域(www.some.sub.domain.example
、.some.sub.domain.example
、.sub.domain.example
等)。
单行原版JS版本(我认为这里唯一没有使用cookie.split()
的版本):
document.cookie.replace(/(?<=^|;).+?(?='=|;|$)/g, name => location.hostname.split('.').reverse().reduce(domain => (domain=domain.replace(/^'.?[^.]+/, ''),document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`,domain), location.hostname));
这是此单行的可读版本:
document.cookie.replace(
/(?<=^|;).+?(?='=|;|$)/g,
name => location.hostname
.split(/'.(?=[^'.]+'.)/)
.reduceRight((acc, val, i, arr) => i ? arr[i]='.'+val+acc : (arr[i]='', arr), '')
.map(domain => document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`)
);
受此处第二个答案和W3Schools影响的答案
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
似乎正在工作
编辑:哇几乎与Zach的有趣完全相同,Stack Overflow将它们放在一起。
编辑:显然是临时的 NVM
如果您担心仅在安全源上清除cookie,则可以使用Cookie Store API及其.delete()方法。
cookieStore.getAll().then(cookies => cookies.forEach(cookie => {
console.log('Cookie deleted:', cookie);
cookieStore.delete(cookie.name);
}));
访问 Cookie Store API 的 caniuse.com 表以检查浏览器支持。
如果您有权访问 jquery.cookie 插件,您可以通过以下方式删除所有 cookie:
for (var it in $.cookie()) $.removeCookie(it);
据我所知,没有办法全面删除域上设置的任何cookie。如果您知道某个 Cookie 的名称,并且脚本与 Cookie 位于同一域中,则可以清除 Cookie。
您可以将值设置为空,并将到期日期设置为过去的某个位置:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
这里有一篇关于使用 javascript 操作 cookie 的优秀文章。
更简单。更快。
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";
}
为什么第一个投票的答案对我不起作用。
正如这个回答所说:
没有 100% 的解决方案可以删除浏览器 cookie。
问题在于,cookie 不仅通过其键"名称"进行唯一标识,还通过其"域"和"路径"进行唯一标识。
如果不知道 Cookie 的"域"和"路径",则无法可靠地删除它。此信息无法通过 JavaScript 的 document.cookie 获得。它也不能通过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;';
}
document.cookie.split(";").forEach(function(c) {
document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/");
});
//clearing local storage
localStorage.clear();
我想我会分享这个清除饼干的方法。也许在某些时候可能对其他人有所帮助。
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;';
}
我有一些更复杂的、面向 OOP 的 cookie 控制模块。它还包含清除所有现有cookie deleteAll
方法。请注意,此版本的deleteAll
方法具有导致删除当前域中所有 cookie 的设置path=/
。如果您只需要从某个范围中删除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.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;
}
}
//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=;';
}
}
这是一个简单的代码,用于删除 JavaScript 中的所有 cookie。
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。
我在这里做出贡献,因为此功能将允许您删除所有cookie(匹配路径,默认情况下为无路径或'
)以及设置为包含在子域中的cookie
function clearCookies( wildcardDomain=false, primaryDomain=true, path=null ){
pathSegment = path ? '; path=' + path : ''
expSegment = "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"
document.cookie.split(';').forEach(
function(c) {
primaryDomain && (document.cookie = c.replace(/^ +/, "").replace(/=.*/, expSegment + pathSegment))
wildcardDomain && (document.cookie = c.replace(/^ +/, "").replace(/=.*/, expSegment + pathSegment + '; domain=' + document.domain))
}
)
}
您可以通过查看 document.cookie 变量来获取列表。清除它们只是循环所有这些并逐个清除它们的问题。
函数式方法 + 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}`;
}, "");
}
注意:不处理路径
这里的几个答案并不能解决路径问题。我相信:如果你控制了网站或其中的一部分,你应该知道使用的所有路径。因此,您只需让它从使用的所有路径中删除所有cookie即可。因为我的网站已经有jquery(出于懒惰),我决定使用jquery cookie,但你可以很容易地根据其他答案将其改编为纯javascript。
在此示例中,我删除了电子商务平台正在使用的三个特定路径。
let mainURL = getMainURL().toLowerCase().replace('www.', '').replace('.com.br', '.com'); // i am a brazilian guy
let cookies = $.cookie();
for(key in cookies){
// default remove
$.removeCookie(key, {
path:'/'
});
// remove without www
$.removeCookie(key, {
domain: mainURL,
path: '/'
});
// remove with www
$.removeCookie(key, {
domain: 'www.' + mainURL,
path: '/'
});
};
// get-main-url.js v1
function getMainURL(url = window.location.href){
url = url.replace(/.+?'/'//, ''); // remove protocol
url = url.replace(/('#|'?|'/)(.+)?/, ''); // remove parameters and paths
// remove subdomain
if( url.split('.').length === 3 ){
url = url.split('.');
url.shift();
url = url.join('.');
};
return url;
};
我将.com网站更改为 .com.br,因为我的网站是多域和多语言
我有用:
function deleteCookie(name) {
document.cookie =
`${name}=; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/`;
// Remove it from local storage too
window.localStorage.removeItem(name);
}
function deleteAllCookies() {
const cookies = document.cookie.split("; ");
cookies.forEach((cookie) => {
const name = cookie.split("=").shift();
this.deleteCookie(name);
});
// Some sites backup cookies in `localStorage`
window.localStorage.clear();
}
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
}
如果你想使用 npm 包js-cookie
并按名称删除 cookie:
import cookie from 'js-cookie'
export const removeAllCookiesByName = (cookieName: string) => {
const hostParts = location.host.split('.')
const domains = hostParts.reduce(
(acc: string[], current, index) => [
...acc,
hostParts.slice(index).join('.'),
],
[]
)
domains.forEach((domain) => cookie.remove(cookieName, { domain }))
}
我们可以这样做:
deleteAllCookies=()=>
{
let c=document.cookie.split(';')
for(const k of c)
{
let s=k.split('=')
document.cookie=s[0].trim()+'=;expires=Fri, 20 Aug 2021 00:00:00 UTC'
}
}
用法:
deleteAllCookies()
- 到期日期是
- 此答案之前的随机日期;它可以是当前日期之前的任何日期
- 在JS中,您无法根据路径读取cookie
- 在JS中,您只能设置或获取cookie
这是上述答案之一的变体。如果传递了参数 (cookieName),则该函数会在所有子域和更高级别域(TLD 除外)中删除此给定 cookie。如果没有传递参数,函数将删除所有域中的所有cookie(TLD除外)。
deleteCookie = function(cookieName) {
var cookies = document.cookie.split("; ");
for (var c = 0; c < cookies.length; c++) {
var d = window.location.hostname.split(".");
while (d.length > 1) {
if (cookieName) {
var cookie = cookieName;
c = cookies.length;
} else {
var cookie = cookies[c].split(";")[0].split("=")[0];
}
var cookieBase = encodeURIComponent(cookie) + '=; 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();
}
}
};
<</div>
div class="answers">我在IE和Edge中发现了一个问题。Webkit浏览器(Chrome,safari)似乎更宽容。设置 cookie 时,请始终将"路径"设置为某些内容,因为默认值将是设置 cookie 的页面。因此,如果您尝试在不同的页面上使其过期而不指定"路径",则路径将不匹配并且不会过期。document.cookie
值不显示 Cookie 的路径或过期时间,因此您无法通过查看该值来派生 Cookie 的设置位置。
如果您需要使来自不同页面的 Cookie 过期,请将设置页面的路径保存在 cookie 值中,以便以后可以将其拉出或始终将"; path=/;"
附加到 cookie 值。然后它将从任何页面过期。
在多种样式的 cookie 上测试了多种样式的浏览器中列出的几乎所有方法后,我发现这里几乎没有任何东西可以工作,甚至 50%。
请根据需要帮助更正,但我要把我的 2 美分扔在这里。以下方法分解了所有内容,基本上基于设置部分构建cookie值字符串,并包括路径字符串的逐步构建,当然从/
开始。
希望这对其他人有所帮助,我希望任何批评都可以以完善这种方法的形式出现。起初,我想要一个简单的 1 行,就像其他人寻求的那样,但 JS cookie 是那些不那么容易处理的事情之一。
;(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 cookie,在清除浏览器历史记录后仍然设置
- 如何清除会话cookie
- 在webview-iphone中通过javascript清除cookie
- 清除firefox中的cookie也会删除localStorage吗
- 清除 PhoneGap 中的 Cookie / 禁止 PhoneGap 使用 Cookie
- 实习生功能测试和清除 cookie 之前和之后
- 当错误时清除cookie 使用护照反序列化用户.js
- 如何使用 JavaScript 清除 cookie 内容
- 清除域上所有用户的具有设定值的单个 Cookie
- 清除 Cookie 并重定向到 html 页面的 HTML 按钮
- C++ 使用批处理脚本清除所有浏览器 Cookie
- 为什么 cookie 在 JavaScript 中被自动清除
- 使用 javascript 清除 cookie
- 通过 jquery 清除 cookie
- 如何清除WinRT网络视图的cookie
- 如何使用perl中的WWW::Scripter模块显式清除cookie
- 从html页面清除cookie时出现问题
- 防止清除cookie欺骗webdriver
- 是否有一种方法来清除缓存和cookie使用javascript
- 如何在javascript中清除cookie而不保留任何到期时间