คุณจะลบคุกกี้ทั้งหมดสำหรับโดเมนปัจจุบันโดยใช้ JavaScript ได้อย่างไร
คุณจะลบคุกกี้ทั้งหมดสำหรับโดเมนปัจจุบันโดยใช้ 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
ธงปิดการใช้งานการเข้าถึงคุกกี้ JavascriptPath
ค่าไว้ (นี่คือความจริงที่ว่าคุกกี้เหล่านั้นจะปรากฏdocument.cookie
แต่คุณไม่สามารถลบได้โดยไม่ต้องระบุPath
ค่าเดียวกันกับที่ตั้งไว้)trim()
เว้นวรรคเพิ่มเติมหรือsplit('; ')
(โดย ';') เพื่อให้ทำงานได้อย่างถูกต้อง ฉันเสนอการแก้ไข
ในกรณีที่คุณต้องการวางอย่างรวดเร็ว ...
document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
และรหัสสำหรับ bookmarklet:
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
localStorage
ไม่ได้window.localStorage.clear()
อาจเป็นประโยชน์เช่นกัน
และนี่คือการล้างคุกกี้ทั้งหมดในทุกเส้นทางและทุกรูปแบบของโดเมน (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();
}
}
})();
หลังจากผิดหวังเล็กน้อยกับตัวเองฉันก็เคาะฟังก์ชั่นนี้ซึ่งจะพยายามลบคุกกี้ชื่อจากทุกเส้นทาง เพียงแค่เรียกสิ่งนี้สำหรับแต่ละคุกกี้ของคุณและคุณควรจะใกล้ชิดกับการลบคุกกี้ทุกตัวที่เคยเป็นมาก่อน
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คุณสามารถลบคุกกี้ทั้งหมดด้วยวิธีนี้:
for (var it in $.cookie()) $.removeCookie(it);
เท่าที่ฉันรู้ไม่มีทางที่จะทำแบบครอบคลุมลบของชุดคุกกี้ใด ๆ ในโดเมน คุณสามารถล้างคุกกี้หากคุณรู้ชื่อและถ้าสคริปต์อยู่ในโดเมนเดียวกับคุกกี้
คุณสามารถตั้งค่าให้ว่างเปล่าและวันหมดอายุเป็นที่ผ่านมา:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
มีบทความที่ดีเกี่ยวกับการจัดการคุกกี้โดยใช้จาวาสคริปต์
document.cookie="username;expires=" + new Date(0).toGMTString()
ไม่แตกต่างกันมากหากคุกกี้หมดอายุ 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;';
});
ดูเหมือนว่าจะทำงาน
แก้ไข: ว้าวเกือบเหมือนกันกับ Zach ที่น่าสนใจว่า Stack Overflow วางเรียงซ้อนกัน
แก้ไข: nvm ที่เห็นได้ชัดชั่วคราว
คิดว่าฉันจะแบ่งปันวิธีนี้ในการล้างคุกกี้ บางทีมันอาจจะมีประโยชน์สำหรับคนอื่นในบางจุด
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;';
}
คุณสามารถรับรายการได้โดยดูที่ตัวแปร document.cookie การล้างข้อมูลทั้งหมดเป็นเพียงการวนลูปของพวกเขาทั้งหมดและการล้างทีละอย่าง
ฉันไม่รู้ว่าทำไมคำตอบที่โหวตครั้งแรกไม่ทำงานสำหรับฉัน
อย่างที่คำตอบนี้บอกว่า:
ไม่มีวิธีแก้ปัญหา 100% ในการลบคุกกี้เบราว์เซอร์
ปัญหาคือมีการระบุคุกกี้ที่ไม่ซ้ำกันโดยไม่ใช่แค่ชื่อ "คีย์" แต่ยังรวมถึง "โดเมน" และ "เส้นทาง" ด้วย
หากไม่ทราบว่า "โดเมน" และ "เส้นทาง" ของคุกกี้คุณจะไม่สามารถลบได้อย่างน่าเชื่อถือ ข้อมูลนี้ไม่สามารถใช้ได้ผ่าน document.cookie ของ JavaScript ไม่สามารถใช้งานผ่านส่วนหัว HTTP คุกกี้ได้เช่นกัน!
ดังนั้นความคิดของฉันคือการเพิ่มการควบคุมเวอร์ชันคุกกี้ด้วยการตั้งค่าเต็มรูปแบบการรับการลบคุกกี้:
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=/';
จะลบคุกกี้ออก
ฉันมีโมดูลควบคุมคุกกี้ที่ซับซ้อนกว่าและมี OOP นอกจากนี้ยังมีdeleteAll
วิธีการล้างคุกกี้ที่มีอยู่ทั้งหมด โปรดสังเกตว่าdeleteAll
วิธีการเวอร์ชันนี้มีการตั้งค่าpath=/
ที่ทำให้การลบคุกกี้ทั้งหมดภายในโดเมนปัจจุบัน หากคุณต้องการลบคุกกี้ออกจากขอบเขตเท่านั้นคุณจะต้องอัพเกรดวิธีนี้โดยเพิ่ม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;
}
}
นี่คือรหัสที่ง่ายในการลบคุกกี้ทั้งหมดใน 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()
เพื่อล้างคุกกี้ทั้งหมด
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=;';
}
}
หลังจากทดสอบวิธีการที่เคยปรากฏในหลาย ๆ รูปแบบของเบราว์เซอร์ในหลายรูปแบบของคุกกี้ฉันพบว่าแทบจะไม่มีอะไรเลยแม้แต่ 50%
โปรดช่วยแก้ไขได้ตามต้องการ แต่ฉันจะโยน 2 เซ็นต์ของฉันที่นี่ วิธีการต่อไปนี้จะแบ่งทุกอย่างลงและสร้างสตริงค่าคุกกี้โดยขึ้นอยู่กับทั้งส่วนการตั้งค่ารวมถึงการสร้างสตริงเส้นทางแบบทีละขั้นตอนโดยเริ่มต้นด้วย/
จากหลักสูตร
หวังว่านี่จะช่วยผู้อื่นและฉันหวังว่าการวิจารณ์ใด ๆ อาจมาในรูปแบบของวิธีนี้ที่สมบูรณ์แบบ ตอนแรกฉันต้องการซับ 1 อันที่บางคนหา แต่คุกกี้ 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, ซาฟารี) ดูเหมือนจะให้อภัยมากกว่า เมื่อตั้งค่าคุกกี้ให้ตั้งค่า "เส้นทาง" เป็นบางสิ่งเสมอเนื่องจากค่าเริ่มต้นจะเป็นหน้าเว็บที่ตั้งค่าคุกกี้ ดังนั้นหากคุณพยายามหมดอายุในหน้าอื่นโดยไม่ระบุ "เส้นทาง" เส้นทางจะไม่ตรงกันและจะไม่หมดอายุ document.cookie
มูลค่าไม่แสดงเส้นทางหรือการหมดอายุของคุกกี้ดังนั้นคุณจึงไม่สามารถได้รับมาที่คุกกี้ถูกกำหนดโดยดูที่ค่า
หากคุณต้องการหมดอายุคุกกี้จากหน้าต่าง ๆ ให้บันทึกเส้นทางของหน้าการตั้งค่าในค่าคุกกี้เพื่อให้คุณสามารถดึงออกมาในภายหลังหรือผนวก"; path=/;"
เข้ากับค่าคุกกี้เสมอ จากนั้นจะหมดอายุจากหน้าใด ๆ
name = ""
แทนเพื่อลบค่านิรนาม