【问题标题】:Auto Logout when user leaves the application without doing logout action当用户离开应用程序而不执行注销操作时自动注销
【发布时间】:2014-05-25 11:00:32
【问题描述】:

有时,用户在没有单击注销按钮的情况下离开应用程序,或者关闭或休眠其机器,甚至关闭与应用程序域相关的所有会话(页面)。所以服务器无法知道用户已注销!在我们的例子中,我们有一个“上次会话所花费的时间”参数来检查为每个用户激活的上次会话的时间。

我们需要在用户离开应用程序时自动注销用户而不执行注销操作! 有流程怎么做吗?

【问题讨论】:

    标签: php session logout


    【解决方案1】:

    您可以在服务器上设置一个 cron 作业来检查陈旧的会话但这不是一个很好的解决方案,因为您必须为您的项目部署另一个解决方案(cron 作业)。 我这样做的方法是在您的项目中包含一个 check_credentials.php 文件,该文件在您的数据库连接后立即运行,然后您将在您的用户表中为您的项目用户添加两个字段:session_idlast_checkin。 该过程将像这样进行:

    登录

    1. 会话已创建,并且可以在第一次点击时从 PHP 中检索 session_id(尚未登录)
    2. 如果用户通过身份验证,将 session_id 保存到数据库中,当前时间戳为 last_checkin

    然后您可以让所有用户在每次页面请求时都进行过期会话检查:

    页面查询

    1. 从所有 last_checkin 超过 10 分钟的用户中删除 session_id。
    2. 检查我当前的 session_id = db.session_id
    3. 如果会话不匹配,请注销并将用户发送到 login.php
    4. 如果 session_id 匹配,则更新 last_checkin

    【讨论】:

      【解决方案2】:

      试试这个:

      if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 600)) {
          session_unset();
          session_destroy();
      }
      $_SESSION['LAST_ACTIVITY'] = time();
      

      如果$_SESSION['LAST_ACTIVITY'] > 600 在过去 600 秒(10 分钟)内没有活动,则销毁会话。

      【讨论】:

      • 好的,但是如何通知服务器,即:如果用户不记得页面,我们如何设置注销时间的值?
      【解决方案3】:

      你可以做类似的事情,

      1. 在用户登录您的站点后设置session

        $_SESSION['last_activity_recorded'] = time();

        这将跟踪用户的活动

      2. 在每个页面上将session 更新为更新时间(即当前时间)

      3. 检查用户是否不活动(此处为 30 分钟)并采取必要步骤取消设置登录凭据(在更新每个页面顶部的 session 之前)

        if($_SESSION['last_activity_recorded'] < time()+30*60){ session_unset(); session_destroy(); }

      【讨论】:

      • 好的,这很好,清楚并且知道,但是在关闭窗口或关闭之后,我们如何通知数据库注销时间,...???如果不再调用应用程序的任何页面?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2011-07-27
      • 2019-04-01
      • 2019-05-12
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多