1

编辑:我最终能够自己解决这个问题。(见下文。)

我目前正在建立一个在线商店,您可以在其中有很多选项来配置您的产品,然后再购买。所有配置数据都存储在服务器上的 PHP 会话中。虽然我们有一个单独的按钮来启动新配置,但事实证明,在帮助客户时,我们的许多员工只是在 Chrome 中打开一个新选项卡并从那里开始他们的新配置。如果他们继续尝试保存配置数据,则单个选项卡中的所有配置都会混淆,因为它们都保存到$_SESSION.

在对互联网(包括 SO)进行一些研究之后,我们决定在每次执行脚本时设置应用程序 ID,例如$app_id = time();. 然后将 ID 包含在页面中,并在处理客户端配置的脚本中设置为 JavaScript 属性。在每个 AJAX 请求中,ID 都会与其他数据一起发送,以便可以将更改应用于正确的配置。

现在配置数据不再混淆,但每次用户重新加载页面时,都会设置一个新的 ID 并加载标准配置。Google 和 SO 再次向我指出了使用 cookie 解决我的问题的方向,就像在这篇文章中一样:http ://www.tedpavlic.com/post_detect_refresh_with_javascript.php所以现在我已经添加onunload="prepareForRefresh()"到我的<body>标签中,我保存了每次卸载到一个名为APP_ID. 然后我改变了我的 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 脚本可以访问存储的值。不幸的是,我想我一定错过了什么。我的网站现在每次刷新时都会在两种配置之间切换。通过 JavaScript 取消设置 cookie<body onload="deleteCookie"...也不起作用。在我看来,好像在某些时候一个错误的 ID 被写入了 cookie,然后它在这两个值之间交替。

我怎样才能防止这种情况?或者将 cookie 设置为 15 秒是否会有所帮助max-age,以便在不重新加载页面时它会过期?

编辑:经过更多的挖掘,我认为我的问题很可能与此答案中所示的客户端和服务器之间的请求-响应结构有关。所以我猜想在onloadPHP 脚本或 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();">

这可能是一个非常肮脏的解决方法,但它确实有效。非常感谢评论、提示和技巧,我渴望学习和改进。:)

4

0 回答 0