【问题标题】:window onbeforeunload event triggering logout窗口 onbeforeunload 事件触发注销
【发布时间】: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


【解决方案1】:

此陈述可能对您或某些人有所帮助

 window.onbeforeunload = function(){
 if(event.clientX <=0 || event.clientY <=0)
 {
 $.ajax({
 type: "POST",
 url: "logout.php"
 });
  }
  }

所以只有当用户点击 [X] 按钮时才会退出

【讨论】:

  • 您应该解释为什么这可以解决问题。因为它看起来像一个非常不可靠的检查。
  • 我刚刚完成了测试。不幸的是,当我关闭浏览器时,它并没有调用 logout.php 脚本并更新表格。
  • 上面我包括了一个决策来识别用户是否点击关闭按钮。否则,在每种卸载情况下,您的 Ajax 调用都会触发
  • 但是为什么这有助于检测对关闭按钮的点击。关闭按钮的位置不规范。并且关闭也可以使用键盘完成。
  • 认为这比问题有更多的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多