Xóa tất cả cookie bằng JavaScript


288

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:


318
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ế:

  • Nó sẽ không xóa cookie với HttpOnlycờ được đặt, vì HttpOnlycờ sẽ vô hiệu hóa quyền truy cập của Javascript vào cookie.
  • Nó sẽ không xóa cookie đã được đặt với một Pathgiá 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 Pathgiá trị được đặt.)

5
Đẹp một, nhưng sau khi thử nghiệm, tôi thấy rằng một trang web chỉ có thể có một cookie mà không có =, và sau đó nó là một cookie không tên, bạn thực sự nhận được giá trị của nó. Vì vậy, nếu eqPos == 1, bạn nên làm name = ""thay vào đó, để xóa giá trị không tên.
PhiLho

59
Coi chừng! Nếu cookie của bạn được định cấu hình để sử dụng một thành phần đường dẫn hoặc tên miền, đoạn mã tiện dụng này sẽ không hoạt động.
Dan Fabulich

1
Thật. Đoạn mã có thể được sửa đổi để hỏi bạn về những chi tiết đó; nhưng điều này làm việc cho hầu hết các trường hợp.
Robert J. Walker

7
Làm thế nào điều này sẽ được sửa đổi để bao gồm thông tin đường dẫn hoặc tên miền?
VUELA

2
Ít nhất trong các cookie Chrome được phân tách bằng ";", vì vậy chúng tôi phải 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.
Daniel Kucal

124

Lót

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=/"); }); })();

1
Một số trang web sao lưu cookie liên tục localStoragevì vậy window.localStorage.clear()cũng có thể hữu ích
Klesun

75

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();
        }
    }
})();

10
đây sẽ là câu trả lời tốt nhất
Kanan Farzali

3
Câu hỏi này hoạt động với tôi bằng chrome, trong khi câu trả lời được chấp nhận thì không
Orny

2
Xuất sắc! Sau khi thử một vài cái khác hoạt động trên máy chủ dev của tôi nhưng không phải trên máy chủ sản xuất, đây là cái đầu tiên hoạt động trên cả hai. Vàng nguyên chất!
Velojet

1
Điều này cũng đối với tôi làm việc tốt hơn nhiều so với câu trả lời được chấp nhận. cảm ơn
guillaumepotier

Phải thêm mã cho tên miền có dấu chấm hàng đầu, một số cookie của tôi có mã đó, một số thì không, mặc dù không có tên miền phụ có liên quan. Nhưng với những thay đổi đó, nó hoạt động tốt với tôi, cách thực hiện đầy đủ nhất mà tôi đã thử cho đến nay.
Ngày

67

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.


@TomHammond, Đó phải là một câu hỏi hoàn toàn mới. Các vấn đề chính là xung quanh tên miền được lưu trữ so với tên miền lưu trữ và khả năng kiểm soát trang được lưu trữ của bạn.
AnthonyVO

2
Điều này vẫn sẽ không xóa cookie httpOnly. Chúng chỉ có thể được sửa đổi qua HTTP.
Sunny R Gupta

14

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);

Tôi vừa thử nó trên trang web của riêng tôi, đã xóa tất cả các cookie. @Cerin sama có thể thử thực thi đoạn mã sau trong bảng điều khiển trước và sau khi xóa cookie không? "for (var it in $ .cookie ()) console.log (it);"
jichi

jichi bạn có bao gồm thư viện jquery cùng với plugin jquery.cookie không?
ko1Rn

11

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.


11
Bạn cũng có thể làm 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
matt b

Cảm ơn bạn cho bài viết!
tx291

7

Đơ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";    
}

2
Không xử lý các đường dẫn.
Scott Smith

6

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


3

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;';
}

2

Bạn có thể nhận được một danh sách bằng cách nhìn vào biến document.cookie. Xóa tất cả chúng chỉ là vấn đề lặp đi lặp lại tất cả chúng và xóa từng cái một.


2

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;';  
}

Điều này giúp tôi tiết kiệm hàng giờ. xứng đáng với upvote. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; sẽ xóa cookie.
CruelEngine

2

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 deleteAllphương thức để xóa tất cả cookie hiện có. Lưu ý rằng phiên bản deleteAllphươ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 paththam số động của tôi vào phương thức này.

Cookielớ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;
    }
}

1

Đâ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.


1

Phương pháp tiếp cận chức năng + 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}`;
  }, "");
}

Lưu ý: Không xử lý đường dẫn


0
//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=;';
    }
}

0

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;
        }
    }
})();

Không hoạt động, hoặc ít nhất là không phải với tôi ... Tôi đã phải xóa cookie bằng HTTP.
adelriosantiago

0

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
}

3
Điều này đòi hỏi plugin jQuery Cookie. Thư viện jQuery không có chức năng cookie ().
Ruchira

-1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.