为什么cookie会存储两次?

时间:2015-07-19 15:10:42

标签: javascript jquery cookies

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

我已设法正确存储它并且它可以工作,但我注意到如果我刷新页面并从扩展或收缩状态切换侧边栏,则会添加第二个cookie,名称相同,但是新价值。

以下是日志输出的内容:

expanded=false; expanded=true; PHPSESSID=2314324545

我需要cookie,以便如果用户想要转到另一个页面,他可以在上一页中看到侧边栏的方式。现在,如果我有2个同名的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');
    }
})

1 个答案:

答案 0 :(得分:1)

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)。查看服务器返回的一种方法是查看路径和域是否都按预期指定,是使用带-S命令行选项的wget:

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

如果您同时允许""和" www",那么你必须强制没有www:

的域名
; Domain=.domain.org

否则你会得到那些副本。