0

我正在使用以下代码设置/获取删除 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, "/");

并通过“onLoad”检索+删除它

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

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

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

我怎样才能在每个页面上只看到一个 beginrequest-cookie?

4

4 回答 4

1

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

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

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

2) 在页面的最后,在 JavaScript 中,获取一个新的时间并计算总时间。

于 2008-10-15T11:06:47.403 回答
1

如果您收到旧 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 可能会混淆,所以不要这样做。但是尝试使用全局正则表达式来获取所有值,并且只使用最新的值。

于 2008-09-24T09:47:46.567 回答
0

您的 set_cookie、get_cookie 和 delete_cookie 代码似乎是正确的。以及您的使用情况。

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

于 2008-09-24T09:01:34.620 回答
0

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

无论如何,猜测一下,我会说您目前遇到的问题很可能是事件没有按照您认为的方式触发。有两种方法可以清除正在发生的事情,一种是让事件在视觉上很明显正在触发,另一种是增加输出的详细程度。任何数量的东西都可能会干扰实际触发的事件:插件、插件、按键等。如果您在 onload 和 onunload 事件触发时打开一个新窗口(或警报或其他),您将能够告诉确定正在调用这些函数。同样,如果您在 cookie 中存储更多数据,例如原始 URL 等,您将能够更好地确定哪些页面正在生成额外的 cookie。

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

于 2008-10-08T04:55:20.710 回答