我正在使用以下代码设置/删除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)上。 我正在使用
设置页面的“onUnload”cookieset_cookie("beginrequest", (new Date()).getTime(), null, null, null, "/");
并通过
检索+删除“onLoad”loadDur = (new Date()).getTime() - get_cookie("beginrequest");
delete_cookie("beginrequest");
衡量页面加载的总时间。
使用firebug时,我经常会看到“剩余的”beginrequest-cookies以及带有过去时间戳的beginrequest的多个实例。
如何才能在每个页面上看到一个beginrequest-cookie?
答案 0 :(得分: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可能会混淆,所以不要这样做。但是尝试使用全局正则表达式来获取所有值,并且只使用最新的值。
答案 1 :(得分:1)
回应对方建议在服务器端做一些工作 - 我过去做过这个:
1)在服务器端捕获请求的时间,并在页面中包含带有时间变量的脚本标记:
<script type="text/javascript"> var start = 1224068624230;</script>
2)在页面的末尾,在JavaScript中,获取新的时间并计算总时间。
答案 2 :(得分:0)
您的set_cookie,get_cookie和delete_cookie的代码似乎是正确的。以及你的用法。
我认为你应该把它转移到你的Java代码中 - 对我而言,似乎比通过cookie破解它更容易。
答案 3 :(得分:0)
我同意amix的两个方面:乍一看你的代码看起来还不错,这可能会更好地处理服务器端的东西。
无论如何,我猜你现在遇到的问题很可能是这些事件没有像你认为的那样触发。有两种方法可以清除正在发生的事情,方法是在视觉上明确表示事件正在发生,并通过增加输出的详细程度。任何数量的东西可能会干扰实际触发的事件:插件,插件,按键等,如果你打开一个新的窗口(或警报,或其他什么)当onload和onunload事件触发时,你将能够分辨确定正在调用函数。同样,如果您在cookie中存储更多数据,如原始URL等,您将能够更好地确定哪些页面正在生成额外的cookie。
我猜你的一个Firefox扩展会间歇性地干扰onunload事件。