Bagaimana Anda menghapus semua cookie untuk domain saat ini menggunakan JavaScript?
Bagaimana Anda menghapus semua cookie untuk domain saat ini menggunakan JavaScript?
Jawaban:
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";
}
}
Perhatikan bahwa kode ini memiliki dua batasan:
HttpOnly
set flag, karena HttpOnly
flag menonaktifkan akses Javascript ke cookie.Path
nilai. (Ini terlepas dari kenyataan bahwa cookie itu akan muncul document.cookie
, tetapi Anda tidak dapat menghapusnya tanpa menentukan nilai yang sama Path
dengan yang ditetapkan.)trim()
ruang tambahan atau split('; ')
(oleh ';') untuk membuatnya berfungsi dengan baik. Saya telah mengusulkan hasil edit.
Jika Anda ingin menempelkannya dengan cepat ...
document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
Dan kode untuk bookmarklet:
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
localStorage
window.localStorage.clear()
Dan ini satu untuk menghapus semua cookie di semua jalur dan semua varian domain (www.mydomain.com, mydomain.com dll):
(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();
}
}
})();
Setelah sedikit frustrasi dengan ini saya sendiri mengetuk fungsi ini yang akan mencoba untuk menghapus cookie bernama dari semua jalur. Panggil saja ini untuk setiap cookie Anda dan Anda harus lebih dekat untuk menghapus setiap cookie dari sebelumnya.
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 + ';';
}
}
Seperti biasa browser yang berbeda memiliki perilaku yang berbeda tetapi ini bekerja untuk saya. Nikmati.
Jika Anda memiliki akses ke plugin jquery.cookie , Anda dapat menghapus semua cookie dengan cara ini:
for (var it in $.cookie()) $.removeCookie(it);
Sejauh yang saya tahu tidak ada cara untuk menghapus semua cookie yang ditetapkan di domain. Anda dapat menghapus cookie jika Anda tahu nama dan jika skrip berada pada domain yang sama dengan cookie.
Anda dapat mengatur nilai menjadi kosong dan tanggal kedaluwarsa di suatu tempat di masa lalu:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
Ada artikel yang sangat bagus di sini tentang memanipulasi cookie menggunakan javascript.
document.cookie="username;expires=" + new Date(0).toGMTString()
- tidak banyak perbedaan jika cookie berakhir 1 detik yang lalu atau pada tahun 1970
Lebih sederhana. Lebih cepat.
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";
}
Jawaban dipengaruhi oleh jawaban kedua di sini dan W3Schools
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
Tampaknya bekerja
sunting: wow hampir persis sama dengan Zach yang menarik bagaimana Stack Overflow menempatkan mereka di samping satu sama lain.
sunting: nvm yang tampaknya sementara
Kupikir aku akan berbagi metode ini untuk menghapus cookie. Mungkin itu mungkin bermanfaat untuk orang lain di beberapa titik.
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;';
}
Saya tidak tahu mengapa jawaban pilihan pertama tidak berhasil untuk saya.
Seperti yang dikatakan jawaban ini :
Tidak ada solusi 100% untuk menghapus cookie browser.
Masalahnya adalah bahwa cookie diidentifikasi secara unik bukan hanya dengan "nama" kunci mereka tetapi juga "domain" dan "jalur" mereka.
Tanpa mengetahui "domain" dan "jalur" cookie, Anda tidak dapat menghapusnya dengan andal. Informasi ini tidak tersedia melalui dokumen JavaScript.cookie. Itu juga tidak tersedia melalui tajuk Cookie HTTP!
Jadi ide saya adalah menambahkan kontrol versi Cookie dengan set lengkap pengaturan, mendapatkan, menghapus 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=/';
akan menghapus cookie.
Saya memiliki beberapa modul kontrol cookie yang lebih canggih dan berorientasi OOP. Ini juga berisi deleteAll
metode untuk menghapus semua cookie yang ada. Perhatikan bahwa versi deleteAll
metode ini memiliki pengaturan path=/
yang menyebabkan penghapusan semua cookie dalam domain saat ini. Jika Anda hanya perlu menghapus cookie dari beberapa ruang lingkup, Anda harus meningkatkan metode ini dengan menambahkan path
parameter dinamis saya ke metode ini.
Ada Cookie
kelas utama :
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);
}
}
Metode cookie setter ( Cookie.set
) agak rumit sehingga saya mendekomposisikannya ke kelas lain. Ada kode yang ini:
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;
}
}
Berikut adalah kode sederhana untuk menghapus semua cookie di 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);
}
Jalankan fungsi deleteAllCookies()
untuk menghapus semua 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}`;
}, "");
}
Catatan: Tidak menangani jalur
//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=;';
}
}
Setelah menguji hampir semua metode yang terdaftar dalam berbagai gaya browser pada banyak gaya cookie, saya menemukan hampir tidak ada yang bekerja di sini bahkan 50%.
Tolong bantu mengoreksi sesuai kebutuhan, tapi saya akan melemparkan 2 sen saya di sini. Metode berikut memecah semuanya dan pada dasarnya membangun string nilai cookie berdasarkan pada kedua bagian pengaturan serta termasuk langkah demi langkah membangun string path, dimulai dengan/
tentu saja.
Semoga ini bisa membantu orang lain dan saya harap kritik apa pun bisa datang dalam bentuk menyempurnakan metode ini. Pada awalnya saya ingin 1-liner sederhana seperti yang dicari beberapa orang lain, tetapi cookie JS adalah salah satu hal yang tidak mudah ditangani.
;(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
}
Saya menemukan masalah di IE dan Edge. Browser Webkit (Chrome, safari) tampaknya lebih mudah memaafkan. Saat mengatur cookie, selalu atur "path" ke sesuatu, karena default akan menjadi halaman yang mengatur cookie. Jadi, jika Anda mencoba untuk kedaluwarsa pada halaman yang berbeda tanpa menentukan "path", path tidak akan cocok dan tidak akan kedaluwarsa. Itudocument.cookie
nilai tidak menunjukkan jalan atau kedaluwarsa untuk cookie, sehingga Anda tidak dapat memperoleh mana cookie ditetapkan dengan melihat nilai.
Jika Anda perlu kedaluwarsa cookie dari halaman yang berbeda, simpan jalur halaman pengaturan dalam nilai cookie sehingga Anda dapat menariknya nanti atau selalu menambahkan "; path=/;"
nilai cookie. Maka akan kedaluwarsa dari halaman mana pun.
name = ""
, untuk menghapus nilai tanpa nama.