【发布时间】:2018-02-22 15:02:49
【问题描述】:
我在 Stack Overflow 上遇到了很多答案,这些答案说明了 JavaScript 如何无法检测到浏览器何时关闭。在大多数情况下,这是真的,但我发现下面的代码似乎能够检测到浏览器正在关闭。
window.onbeforeunload = function(){
$.ajax({
type: "POST",
url: "logout.php"
});
}
在理想情况下,用户要么自己注销,要么闲置足够长的时间以自动注销,但情况并非总是如此。
所以我使用上面的代码在用户关闭浏览器时调用logout.php脚本。
这是我的问题:浏览我的网站时,似乎总是随机的,上面的脚本被调用,用户当然会被注销。
我可以在它发生之前导航到一个页面或来回浏览多个页面。有时登录时会立即调用它,我什至无法进入该站点。
我无法弄清楚为什么会发生这种情况,尤其是随机发生。
编辑
添加 logout.php 脚本:
<?php
include ('include/sessions.php');
$update = "UPDATE users SET lastlogoutdate = NOW(), currentlyloggedin = 'N' WHERE username = '$username'";
$updateQuery = mysqli_query($dbc, $update);
session_destroy();
header('Location: index.php');
?>
【问题讨论】:
-
logout.php如何实际执行注销?它是清除 cookie 还是不止于此?onbeforeunload应该在导航发生时被调用。 -
@phuzi - 我没有使用 cookie。我在上面包含了 logout.php 脚本。
-
不清除cookie客户端有什么原因吗?
onbeforeunload将在您离开当前文档时被调用,无论是使用后退、前进还是关闭按钮。是否调用logout.php取决于网络延迟,非常不可靠。 -
@JohnBeasley 这很有意义,从技术上讲,他们仍在登录,因此看起来已登录是正确的。如果他们重新访问您的网站,则 cookie 存在并且会话仍然存在,他们也不必再次登录。
-
不活动注销是您在服务器端执行的操作。您可能会错过许多其他情况,例如:互联网连接丢失,PC/笔记本电脑/平板电脑在没有关闭浏览器的情况下被发送到睡眠模式,PC/笔记本电脑/平板电脑崩溃,...。因此会话的生命周期必须定义在服务器端,并且对于从客户端到服务器的每次连接,会话都可以延长。
标签: javascript jquery ajax window onbeforeunload