为什么cookie存储两次?

Why is a cookie stored twice?

本文关键字:两次 cookie 存储 为什么      更新时间:2023-09-26

我试图在cookie中存储页面上某个元素的状态,更准确地说是侧边栏的扩展或缩小状态。

我已经设法正确地存储它,它的工作,但我注意到,如果我刷新页面,从扩展或缩小状态切换侧边栏,有第二个cookie添加,具有相同的名称,但一个新的值。

日志输出如下:

expanded=false; expanded=true; PHPSESSID=2314324545

我需要cookie,这样如果用户想要进入另一个页面,他就可以看到他在前一个页面中离开的侧边栏。现在,如果我有两个同名的cookie,当我检查其值时就会出现问题。

我是这样实现的:

$('.expand-button').on('click', function(e) {
    $('.pushmenu').toggleClass('expanded');
    $('.navbar-left').toggleClass('expanded');
    $('.navbar-left-2').toggleClass('small')
    if( $(window).width()+scrollbarWidth > 1240){
        $('.container.fluid-content').toggleClass('shrinked')
    }
    if($('.pushmenu').hasClass('expanded')) {
        expandedValue = true;
        document.cookie = 'expanded=' + expandedValue;
        console.log(document.cookie);
    } else {
        expandedValue = false;
        document.cookie = 'expanded=' + expandedValue;
        console.log(document.cookie);
    }
})
$(window).on('load', function() {
        //cookie is already set
    console.log(document.cookie);
    if( document.cookie.indexOf('expanded=true') != -1 ) {
        $('.pushmenu').toggleClass('expanded');
        $('.navbar-left').toggleClass('expanded');
        $('.navbar-left-2').toggleClass('small')
        if( $(window).width()+scrollbarWidth > 1240){
            $('.container.fluid-content').toggleClass('shrinked')
        }
    } else {
        console.log('not doing anything');
    }
})

cookie链接到路径和域名。如果每个cookie都有不同的域名,您可能会在服务器端收到两个(或更多!)cookie,例如:

.domain.org
.www.domain.org

您收到cookie的顺序是从最不合格的域名到最合格的域名(如该列表所示)

我建议你安装FireBug(假设你使用的是FireBug兼容的浏览器,比如Firefox),然后看看里面的cookie。您将看到详细信息,如路径和域名以及到期日期。

要设置路径,只需使用如下命令:

blah=value; Path=/

类似地,您可以使用:

强制域
blah=value; Domain=.domain.org

可以用分号分隔多个参数:

blah=value; Path=/; Domain=.domain.org

如果你正在使用HTTPS(安全域),我强烈建议你也使用secure:

blah=value; Path=/; Domain=.domain.org; Secure

使用FireBug,你可以删除一些cookie。您可以使用第一个版本(.domain.org)或最后一个版本(.www.domain.org)。

差异可能来自于你的前端代码(JavaScript)和后端代码(PHP)。查看服务器返回的内容、查看Path和Domain是否都按照预期指定的一种方法是使用wget和-S命令行选项:

wget -S http://domain.org
wget -S http://www.domain.org

如果您同时允许"answers"www",那么您必须强制使用没有www的域:

; Domain=.domain.org