帮助解决一些简单的JavaScript Cookie误解

时间:2020-03-06 14:38:47  来源:igfitidea点击:

即时通讯使用以下代码来设置/获取删除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();
}

但是我得到的结果不一致。
例如,在起始页(www.example.com/start)上设置的cookie不会总是显示在后续页面(www.example.com/foo/thing.jsp)上。
我使用以下方法将页面的Cookie设置为" onUnload"

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

并通过+检索+将其"删除"

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

衡量页面加载所需的总时间。

使用Firebug时,我经常看到"剩余"的beginrequest-cookie和带有过去时间戳记的beginrequest的多个实例。

我如何才能在每页上看到一个beginrequest-cookie?

解决方案

set_cookie,get_cookie和delete_cookie代码似乎正确。以及用法。

我认为我们应该将其移到Java代码中,这似乎比通过cookie破解更简单。

如果我们获取的是旧Cookie,则可能是因为页面包含大量内容,并且在onunload之前未调用onload(因为该页面尚未完成加载)。因此,通过在onload和onunload中调用如下代码来删除cookie:

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

如果我们加载页面的速度足够快,以至于'delete_cookie'cookie尚未正确过期,并且get_cookie实现正在接受该条件,那么我们也可能会遇到竞争。因此,请尝试更改get_cookie中的正则表达式以仅选择具有以下值的cookie:

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

另外,如果我们在一个以上的窗口(或者选项卡)中查看网站,它们的cookie可能会混杂在一起,所以不要这样做。但是,请尝试使用全局正则表达式选择所有值,而仅使用最新的值。

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

无论如何,我想说的是,我们目前遇到的问题很可能是这些事件并没有像我们认为的那样引发人们的注意。我们可以通过两种方式清除正在发生的情况,一种是在视觉上使该事件正在触发,另一种是通过增加输出的详细程度。可能有许多事情干扰实际触发的事件:插件,插件,按键等。如果在onload和onunload事件触发时打开一个新窗口(或者警报,等等),我们将能够知道确定函数已被调用。同样,如果我们在Cookie中存储更多数据,例如原始URL等,则可以更好地确定哪些页面在生成额外的Cookie。

我猜想Firefox扩展之一会间歇性地干扰onunload事件。

回应对方的建议,在服务器端做一些工作,我过去已经这样做过:

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

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

2)在页面末尾,使用JavaScript获取新时间并计算总时间。