【问题标题】:PHP Automaticly log off users in sessionPHP在会话中自动注销用户
【发布时间】:2019-09-30 05:05:20
【问题描述】:

我有一个有多个用户登录的数组。我想注销已经不活动 XX 时间的用户。

让我解释一下情况。我有 1 台电脑,人们可以在其中开始和停止他们的任务。我存储他们的 id,以便他们可以在活动用户之间切换,以非常快速地停止、启动和查看有关其任务的信息。有时会发生很多人只使用这台电脑来开始他们的任务并在另一个工作空间中继续,所以活跃用户的列表会快速增长,而其他人必须在活跃用户的列表之间搜索以找到他们自己的用户 ID。

用户ID列表:

4700、7100 和 2526 是登录/活动的用户 ID。

这是我会话中的数组:

'timestamp' => 
    array (size=3)
      4700 => int 1557473018
      7100 => int 1557472637
      2526 => int 1557473020

我发现了很多用户注销脚本,但一切都基于 1 个用户。

它正在使用 PHP,但我希望它能够自动使用 javascript

类似的东西我已经试过了。

  <script language='javascript'>
  var timeout = 60 * 1000; // 10 seconds  

  var lastAction = <?php echo isset($_SESSION['timestamp']) ? $_SESSION['timestamp'] : time();?>;
  var timer = function(){
     return setInterval(function(){
        var now = new Date();
        if (typeof lastAction !=='undefined' ){
          if(now.getTime() - lastAction >= timeout ){
             alert('have been logged out');
             <?php afmelden($Ids); ?>
          }
        }
      }, 1000) // repeat every 1 second;
  }
  window.onmousemove = function(e){
   clearInterval(timer);
   timer();   
  }
  window.onclick= function(e){
    clearInterval(timer);
    timer();
  }

  // and make initial call
  timer();
</script>

【问题讨论】:

  • 好的。那么你的尝试出了什么问题?
  • @ADyson 我让它在 PHP 中工作。当您刷新页面时,它将检查非活动用户。我想自动完成,但我不知道怎么做......这里的脚本不停地给我警报,即使我将计时器设置为 24 小时。
  • 一个明显的问题可能是 PHP 的 time() 为单位返回时间,而 JavaScript 的 getTime毫秒 为单位返回时间...如果您将生成的值记录到控制台中,您可能已经注意到这种巨大的差异?
  • 我看到了不同之处。 PHP Time() 为:1557739523 Javascript getTime() 为:1557739523400
  • 好的,希望您现在意识到如何解决这个问题?

标签: javascript php session


【解决方案1】:

如果您有许多活动用户,则将服务器轮询到数据库可能会导致大量流量。我能想到的最好的解决方案是将时间戳添加到记住我的令牌中。对于这个例子,我将使用JWT

当您登录用户时,创建您的令牌以保存您需要的任何信息:

session_start();

$_SESSION['ssid'] = \Firebase\JWT\JWT::encode(array(
    'exp' => 1557738566 // Your expiration time from the DB
    'uid' => 1 // User ID the account is using
    'obj' => array() // Anything else you want to store in cache
));

我们现在需要将请求发送到服务器以查看任何更改。

( ( $ ) => {
    var timer = () => {
        setInterval( () => {
            $.get( '/your/route' ).done( ( resp ) => {
                // resp will hold time left, current uid and any other
            } );
        }, 1000 );
    }
} )( JQuery );

服务器的简单用法可以是:

session_start();
header('Content-Type: application/json');

if(isset($_SESSION['ssid'])) {
    try {
        // TODO: Check the exp and log user out if expired
        die(json_encode(\Firebase\JWT\JWT::decode($_SESSION['ssid'], array())));
    }
    catch (Exception $e) {
        // bearer was invalid or expired - log them out
    }

    return;
}

// Redirect them to login

如果您需要根据用户操作更新时间,您可以更新令牌中的时间,如有必要,还可以更新数据库。

想法:

我之所以这么说,是因为拥有像 afmelden($Ids) 这样的开放路由并不会阻止某人在浏览器中使用他们想要的任何 ID 直接访问该路由,除非该路由具有 RBAC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-06-11
    • 2022-12-22
    • 1970-01-01
    相关资源
    最近更新 更多