【问题标题】:How to get user logout when he close browser关闭浏览器时如何让用户注销
【发布时间】:2017-01-19 08:46:13
【问题描述】:

在用户和密码正确后,我有一个带有登录系统的网站,更新用户设置标志 1 以不允许其他人同时与该用户连接

$sql="update user set flag = 1 where id_user =".$_SESSION['id_user'];

我有一个 logout.php,当我单击注销按钮时将标志重置为 0,但我也想在用户关闭浏览器时将标志更改为 0。

我试图通过以下方式解决它: javascript/jquery onbeforeunload 卸载和 会话失败,但我失败了

【问题讨论】:

  • 这不是一个好主意。如果他们的浏览器崩溃了怎么办?您现在已将它们无限期锁定。
  • 我在 login.php 有一个重置标志的链接
  • 为@Darkrum 所说的在断电、计算机崩溃、网络中断时添加更多场景。还取决于此重置标志链接的作用,它只会为某些用户提供不必要的步骤,这不会有任何好处,因为第二个人可以在第一个人仍积极登录时使用此链接重置标志。

标签: javascript php jquery security session


【解决方案1】:

你不能这样做。

登录时,您应该检查您的会话存储是否存在请求登录的用户的会话。这当然需要一个您可以实际检查的会话存储,即。在数据库中。

【讨论】:

    【解决方案2】:

    我有一个建议用 PHP 解决,忘记了 JavaScript

    将来自登录用户的最后一次请求时间存储在您的数据库中,可能在用户表的字段中,也可能在 cookie 中(客户端)。因此,每次用户发出请求时,将用户表上的该字段更新为当前时间和 cookie。

    如果有人尝试与拥有flag = 1 的用户建立联系,请验证上次请求时间。如果是五分钟(或十分钟、二十分钟或其他任何时间)之前或更长时间,则允许登录。如果小于此时间,则不允许。

    如果允许,那么我们在系统中有两个人有一个会话,所以两个人都被记录了,这是个问题。

    为了解决这个问题,当他们中的任何人尝试查看页面时,如果cookie(客户端)中存储的最后请求时间与数据库中存储的不同,则销毁会话。如果相等,则允许导航并再次更新上次请求时间(在 cookie 和数据库中)。

    这个想法是,五(或十、二十或其他)分钟不活动意味着用户离开。

    您还可以将php.ini 中的session.gc_maxlifetime 更改为更低的时间。比如要五分钟,试试:

    session.gc_maxlifetime=300
    

    修改php.ini后,重启Apache。

    Default session time out in Apache and CentOS

    【讨论】:

      【解决方案3】:

      这样做是个坏主意。如果要检查用户登录,则需要更多参数,而不仅仅是标记用户登录。我同意@Helinton Mello,如果用户在 10 分钟前登录,您可以检查用户上次登录的时间标志仍然是 1,您可以授予他登录权限,但如果用户不到 10 分钟,您可以再次通知比如“你已经登录,请联系你的管理网络”。

      【讨论】:

        猜你喜欢
        • 2017-12-28
        • 2020-10-23
        • 2012-04-24
        • 1970-01-01
        • 2011-01-11
        • 2019-09-12
        • 2015-08-22
        • 2017-01-05
        相关资源
        最近更新 更多