编辑:我最终能够自己解决这个问题。 (见下文。)
我目前正在建立一个在线商店,您可以在购买之前配置许多选项来配置您的产品。所有配置数据都存储在服务器上的PHP会话中。虽然我们有一个单独的按钮来启动新配置,但事实证明,在帮助客户时,我们的许多员工只需在Chrome中打开一个新标签页并从那里开始新配置。如果他们继续尝试保存他们的配置数据,单个选项卡中的所有配置都会混淆,因为它们都保存在$_SESSION
中的同一数据数组中。
在对互联网(包括SO)进行一些研究之后,我们决定在每次执行脚本时设置的应用程序ID,如$app_id = time();
。然后,ID将包含在页面中,并在脚本中设置为处理客户端配置的JavaScript属性。在每个AJAX请求中,ID与其他数据一起发送,以便可以将更改应用于正确的配置。
现在配置数据不再混淆,但每次用户重新加载页面时,都会设置一个新ID并加载标准配置。谷歌和SO再一次向我指出了使用cookie来解决我的问题的方向,例如在这篇文章中:http://www.tedpavlic.com/post_detect_refresh_with_javascript.php所以现在我已将onunload="prepareForRefresh()"
添加到我的<body>
标签中,而我将每次卸载时的ID保存到名为APP_ID
的cookie中。然后我改变了我的PHP脚本来检查这个cookie是否存在,如下所示:
if (isset($_COOKIE['APP_ID'])) { // ID has been set on unload
$app_id = $_COOKIE['APP_ID']; // set ID to previous value
$cookie = setcookie('APP_ID', '', time() - 4800); // unset cookie
echo 'refresh';
} else {
$app_id = time(); // set ID to new value
echo 'new page';
}
这一切都可以解决,JavaScript在卸载页面时正确设置了cookie,我的PHP脚本可以访问存储的值。不幸的是,我想我一定错过了什么。我的网站现在在每次刷新时在两种配置之间切换。通过像<body onload="deleteCookie"...
这样的JavaScript取消设置cookie也不起作用。在我看来,好像在某个时刻将错误的ID写入cookie,然后它在这两个值之间交替。
我该怎样防止这种情况?或者为cookie设置一个15秒的max-age
是否有帮助,以便在没有重新加载页面时它会过期?
编辑:经过多次挖掘后,我认为我的问题很可能与this answer中说明的客户端和服务器之间的请求 - 响应结构有关。所以我想在onload
或PHP脚本中取消设置cookie不会改变任何东西。但是如何在页面重新加载时记住ID?
解决方案(或者至少对我有用的东西):
我已将我在PHP中设置ID的部分更改为:
if (isset($_COOKIE['APP_ID']) && $_COOKIE['APP_ID'] != '') { // ID has been set on beforeunload
$app_id = $_COOKIE['APP_ID']; // set ID to previous value
} else {
$app_id = uniqid(); // set ID to new value
}
然后,在我的JavaScript中,我编写了两个函数:
function unsetCookie() {
document.cookie = 'APP_ID=;'; // unset cookie
}
function setCookie() {
document.cookie = 'APP_ID=' + $('#my-element').data('app-id') + ';';
}
并在HTML中注册了这些内容:<body onbeforeunload="setCookie();" onload="unsetCookie();">
这可能是一个强大的脏解决方法,但它的工作原理。评论,提示和技巧受到高度赞赏,我渴望学习和改进。 :)