Removing cookies with the same name but different paths

前端 未结 1 2037
傲寒
傲寒 2021-02-07 13:43

I need to delete clientside cookies with the same name but with different paths. What is the best way to do this in javascript.

1条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-02-07 14:25

    Just specify the same path of the cookie you want to remove, giving it a past expiration.

    document.cookie = 'name=value1; path=/';
    document.cookie = 'name=value2; path=/path/';
    
    alert(document.cookie); // name=value1; name=value2
    
    
    document.cookie = 'name=; path=/path/; expires=' + new Date(0).toUTCString();
    
    alert(document.cookie); // name=value1
    

    Changing it to expire the cookie with a path of / will still only expire one of the cookies -- the path given has to match the path set:

    document.cookie = 'name=; path=/; expires=' + new Date(0).toUTCString();
    
    alert(document.cookie); // name=value2
    

    To remove both, you'll have to expire each with their path:

    document.cookie = 'name=; path=/; expires=' + new Date(0).toUTCString();
    document.cookie = 'name=; path=/path/; expires=' + new Date(0).toUTCString();
    
    alert(document.cookie); // {blank}
    

    Now, these examples assume you're browsing /path/ or a sub-directory of it.


    [edit]

    To remove in bulk, try something like this:

    function expireAllCookies(name, paths) {
        var expires = new Date(0).toUTCString();
    
        // expire null-path cookies as well
        document.cookie = name + '=; expires=' + expires;
    
        for (var i = 0, l = paths.length; i < l; i++) {
            document.cookie = name + '=; path=' + paths[i] + '; expires=' + expires;
        }
    }
    
    expireAllCookies('name', ['/', '/path/']);
    

    Demo: http://jsfiddle.net/M2dZ3/

    You can also fake path lookups by splitting and iterating window.location.pathname:

    function expireActiveCookies(name) {
        var pathname = location.pathname.replace(/\/$/, ''),
            segments = pathname.split('/'),
            paths = [];
    
        for (var i = 0, l = segments.length, path; i < l; i++) {
            path = segments.slice(0, i + 1).join('/');
    
            paths.push(path);       // as file
            paths.push(path + '/'); // as directory
        }
    
        expireAllCookies(name, paths);
    }
    

    Demo: http://jsfiddle.net/M2dZ3/2/

    0 讨论(0)
提交回复
热议问题