Làm thế nào để bạn xóa tất cả các cookie cho tên miền hiện tại bằng cách sử dụng JavaScript?
Làm thế nào để bạn xóa tất cả các cookie cho tên miền hiện tại bằng cách sử dụng JavaScript?
Câu trả lời:
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";
}
}
Lưu ý rằng mã này có hai hạn chế:
HttpOnly
cờ được đặt, vì HttpOnly
cờ sẽ vô hiệu hóa quyền truy cập của Javascript vào cookie.Path
giá trị. (Điều này mặc dù thực tế là những cookie đó sẽ xuất hiện document.cookie
, nhưng bạn không thể xóa nó mà không chỉ định cùng Path
giá trị được đặt.)trim()
thêm khoảng trắng hoặc split('; ')
(bởi ';') để làm cho nó hoạt động chính xác. Tôi đã đề xuất một chỉnh sửa.
Trong trường hợp bạn muốn dán nó nhanh chóng ...
document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
Và mã cho bookmarklet:
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
localStorage
vì vậy window.localStorage.clear()
cũng có thể hữu ích
Và đây là một để xóa tất cả cookie trong tất cả các đường dẫn và tất cả các biến thể của tên miền (www.mydomain.com, mydomain.com, v.v.):
(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();
}
}
})();
Sau một chút thất vọng với điều này, tôi đã kết hợp chức năng này để cố gắng xóa một cookie có tên khỏi tất cả các đường dẫn. Chỉ cần gọi cái này cho mỗi cookie của bạn và bạn nên tiến gần hơn đến việc xóa mọi cookie trước đó.
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 + ';';
}
}
Như mọi trình duyệt khác nhau có hành vi khác nhau nhưng điều này làm việc cho tôi. Thưởng thức.
Nếu bạn có quyền truy cập vào plugin jquery.cookie , bạn có thể xóa tất cả cookie theo cách này:
for (var it in $.cookie()) $.removeCookie(it);
Theo như tôi biết thì không có cách nào để xóa chăn của bất kỳ cookie nào được đặt trên miền. Bạn có thể xóa cookie nếu bạn biết tên và nếu tập lệnh nằm trên cùng một tên miền với cookie.
Bạn có thể đặt giá trị thành trống và ngày hết hạn thành một nơi nào đó trong quá khứ:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
Có một bài viết tuyệt vời ở đây về thao tác cookie bằng javascript.
document.cookie="username;expires=" + new Date(0).toGMTString()
- không có nhiều khác biệt nếu cookie hết hạn 1 giây trước hoặc vào năm 1970
Đơn giản hơn. Nhanh hơn.
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";
}
Một câu trả lời bị ảnh hưởng bởi cả câu trả lời thứ hai ở đây và W3Schools
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
Có vẻ như đang làm việc
chỉnh sửa: wow gần giống hệt như thú vị của Zach về cách Stack Overflow đặt chúng cạnh nhau.
chỉnh sửa: nvm đó là tạm thời rõ ràng
Hình tôi muốn chia sẻ phương pháp này để xóa cookie. Có lẽ nó có thể hữu ích cho người khác tại một số điểm.
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;';
}
Tôi không biết tại sao câu trả lời bỏ phiếu đầu tiên không hiệu quả với tôi.
Như câu trả lời này đã nói:
Không có giải pháp 100% để xóa cookie trình duyệt.
Vấn đề là cookie được xác định duy nhất bởi không chỉ bởi "tên" chính mà còn cả "tên miền" và "đường dẫn" của chúng.
Nếu không biết "tên miền" và "đường dẫn" của cookie, bạn không thể xóa nó một cách đáng tin cậy. Thông tin này không có sẵn thông qua document.cookie của JavaScript. Nó cũng không có sẵn thông qua tiêu đề Cookie HTTP!
Vì vậy, ý tưởng của tôi là thêm một điều khiển phiên bản Cookie với toàn bộ cài đặt, nhận, xóa 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=/';
sẽ xóa cookie.
Tôi có một số mô-đun kiểm soát cookie theo định hướng OOP tinh vi hơn. Nó cũng chứa deleteAll
phương thức để xóa tất cả cookie hiện có. Lưu ý rằng phiên bản deleteAll
phương thức này có cài đặt path=/
gây ra việc xóa tất cả cookie trong miền hiện tại. Nếu bạn chỉ cần xóa cookie từ một số phạm vi, bạn sẽ phải nâng cấp phương thức này để thêm path
tham số động của tôi vào phương thức này.
Có Cookie
lớp chính :
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);
}
}
Phương thức setter cookie ( Cookie.set
) khá phức tạp nên tôi đã phân tách nó thành lớp khác. Có mã của cái này:
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;
}
}
Đây là một mã đơn giản để xóa tất cả các cookie trong 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);
}
Chạy chức năng deleteAllCookies()
để xóa tất cả các 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}`;
}, "");
}
Lưu ý: Không xử lý đường dẫn
//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=;';
}
}
Sau khi thử nghiệm phương pháp gần như chưa từng được liệt kê trong nhiều kiểu trình duyệt trên nhiều kiểu cookie, tôi thấy hầu như không có gì ở đây hoạt động thậm chí 50%.
Xin hãy giúp sửa khi cần, nhưng tôi sẽ ném 2 xu của tôi vào đây. Phương thức sau đây phá vỡ mọi thứ và về cơ bản xây dựng chuỗi giá trị cookie dựa trên cả hai phần cài đặt cũng như bao gồm xây dựng từng bước của chuỗi đường dẫn, bắt đầu bằng/
tất nhiên .
Hy vọng điều này sẽ giúp những người khác và tôi hy vọng bất kỳ lời chỉ trích nào có thể đến dưới hình thức hoàn thiện phương pháp này. Lúc đầu, tôi muốn có một lớp lót đơn giản như một số người khác tìm kiếm, nhưng cookie JS là một trong những thứ không dễ xử lý như vậy.
;(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;
}
}
})();
Câu hỏi:
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
}
Tôi tìm thấy một vấn đề trong IE và Edge. Các trình duyệt Webkit (Chrome, safari) dường như dễ tha thứ hơn. Khi đặt cookie, luôn đặt "đường dẫn" thành thứ gì đó, vì mặc định sẽ là trang đặt cookie. Vì vậy, nếu bạn cố gắng hết hạn nó trên một trang khác mà không chỉ định "đường dẫn", đường dẫn sẽ không khớp và nó sẽ không hết hạn. Cácdocument.cookie
giá trị không hiển thị đường dẫn hoặc hết hạn cho một cookie, vì vậy bạn không thể lấy được nơi cookie được thiết lập bằng cách nhìn vào giá trị.
Nếu bạn cần hết hạn cookie từ các trang khác nhau, hãy lưu đường dẫn của trang cài đặt vào giá trị cookie để bạn có thể kéo nó ra sau hoặc luôn luôn nối "; path=/;"
vào giá trị cookie. Sau đó, nó sẽ hết hạn từ bất kỳ trang nào.
name = ""
thay vào đó, để xóa giá trị không tên.