代码之家  ›  专栏  ›  技术社区  ›  Andreas Petersson

javascript cookie误解

  •  0
  • Andreas Petersson  · 技术社区  · 16 年前

    我正在使用以下代码设置/获取删除Cookie:

    function get_cookie(cookie_name)
    {
        var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)');
    
        if (results)
            return ( decodeURI(results[2]) );
        else
            return null;
    }
    
    
    function set_cookie(name, value, exp_y, exp_m, exp_d, path, domain, secure)
    {
        var cookie_string = name + "=" + encodeURI(value);
    
        if (exp_y)
        {
            var expires = new Date(exp_y, exp_m, exp_d);
            cookie_string += "; expires=" + expires.toGMTString();
        }
    
        if (path)
            cookie_string += "; path=" + encodeURI(path);
    
        if (domain)
            cookie_string += "; domain=" + encodeURI(domain);
    
        if (secure)
            cookie_string += "; secure";
    
        document.cookie = cookie_string;
    }
    
    
    function delete_cookie(cookie_name)
    {
        var cookie_date = new Date();  // current date & time
        cookie_date.setTime(cookie_date.getTime() - 1);
        document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString();
    }
    

    但我得到的结果不一致。 例如,start page(www.example.com/start)上设置的cookie不会总是显示在后续页面(www.example.com/foo/thing.jsp)上。 我正在使用

    set_cookie("beginrequest", (new Date()).getTime(), null, null, null, "/");
    

    通过

    loadDur = (new Date()).getTime() - get_cookie("beginrequest");
    delete_cookie("beginrequest");
    

    测量页面加载所用的总时间。

    在使用firebug时,我经常看到“剩余”的beginrequest cookies和带有过去时间戳的beginrequest的多个实例。

    我怎样才能做到每页只看到一个beginrequest cookie?

    4 回复  |  直到 6 年前
        1
  •  1
  •   Daniel James John Zwinck    16 年前

    如果你得到的是旧的cookies,那可能是因为你的页面包含了很多内容,onload在onunload之前没有调用(因为页面没有完成加载)。因此,通过从onload和onunload调用类似的命令删除cookie:

    var deleted_cookie = false;
    function delete_timestamp() {
        if(!deleted_cookie) delete_cookie("beginrequest");
        deleted_cookie = true;
    }
    

    如果加载下一页的速度足够快,以至于“delete_cookie”cookie未正确过期,并且get_cookie实现正在获取该cookie,则还可能存在竞赛条件。因此,请尝试将get_cookie中的正则表达式更改为仅拾取具有以下值的cookie:

    var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]+)(;|$)');
    

    此外,如果您在多个窗口(或选项卡)中查看网站,他们的cookie可能会混淆,所以不要这样做。但是尝试使用全局正则表达式来获取所有值,并且只使用最新的值。

        2
  •  1
  •   Remy Sharp    16 年前

    响应对方的建议,在服务器端做一些工作-我以前做过:

    1)在服务器端捕获请求时间,并在页面中包含带有时间变量的脚本标记:

    <script type="text/javascript"> var start = 1224068624230;</script>
    

    2)在页面的末尾,用javascript获取一个新时间并计算总时间。

        3
  •  0
  •   amix    16 年前

    您的set_cookie、get_cookie和delete_cookie代码似乎正确。还有你的用法。

    我认为你应该把它移到你的Java代码中——对我来说,这似乎比通过cookies破解这个更容易。

        4
  •  0
  •   joh6nn    16 年前

    在这两个方面我都同意amix的观点:乍看之下,您的代码看起来还不错,服务器端的一些东西可能会更好地处理这一点。

    不管怎样,我猜,你现在遇到的问题很可能不是你想象的那样。有两种方法可以清除正在发生的事情,一种是使事件在视觉上明显地触发,另一种是增加输出的详细程度。任何数量的东西都可能干扰实际触发的事件:插件、插件、按键等等。如果在onload和onunload事件触发时打开一个新窗口(或警报,或其他什么),您将能够确定正在调用这些函数。同样,如果您在cookies中存储更多的数据,比如原始url等,您将能够更好地了解哪些页面正在生成额外的cookies。

    我猜你的一个firefox扩展间歇性地干扰onunload事件。