【问题标题】:session destroy after count down timer reach 0倒数计时器达到 0 后会话销毁
【发布时间】:2017-09-07 14:31:49
【问题描述】:

使用倒数计时器注销用户,如果用户处于非活动状态 2 小时..

function Timer(duration, display)  {
    var timer = duration, hours, minutes, seconds;
    setInterval(function () {
        hours = parseInt((timer /3600)%24, 10)
        minutes = parseInt((timer / 60)%60, 10)
        seconds = parseInt(timer % 60, 10);

        hours = hours < 10 ? "0" + hours : hours;
        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.text(hours +":"+minutes + ":" + seconds);
        if(hours == 0 && minutes == 0 && seconds == 0){
            $.ajax({
              url:'../ajax/logoutuser.php',

              success: function(data){
                  console.log('logout');
              }
            });
        }else{
           --timer;
        }

    }, 1000);
}

window.onload = function () {
  var twentyFourHours = 1 * 1 * 3;
  var display = $('#time');


 Timer(twentyFourHours, display);


};

由于我不能在 jquery 函数上调用 session destroy 我使用 ajax 来发出请求..

<?php

require_once '../config/database.php';
require_once '../includes/dboperations/user.php';

$database = new Database();
$conn = $database->getConnection();
$db =  new User($conn);

$user = json_decode($_SESSION["user"]);
        $db->offlineStatus($user->user_id);


        session_destroy();

        echo "<script>window.location.href = '../index.php'</script>";

?>

但是发生的情况是,它在发出请求后并没有调用会话销毁函数。它运行 console.log 内部成功函数..

如果2小时不活动,有没有办法注销用户

【问题讨论】:

  • 据我所知,您的不活动检测会强制用户刷新/重新加载页面以被视为活动。将不活动视为无动作(无鼠标移动、无按键、无点击)不是更好吗?
  • 我不知道如何检查,但如果你能给我一个想法会更好,因为这就是我想要做的。
  • 如果最主要的原因是客户端的某些事情(例如破坏 cookie),您可能想要使用 Javascript 解决方案(即使我个人也不喜欢它,因为客户端 Javascript 可以由用户伪造)。如果这是您想要实现的服务器端,请选择服务器端会话销毁。或两者兼而有之...我更喜欢服务器端,尽管 b/c 更安全:在您的 php 代码中记录用户活动,如果活动(发布/获取等)时间 > 最大用户空闲时间,则简单地踢用户(销毁会话)。
  • 例如看看here。 SO上有很多解决方案:)

标签: javascript php jquery ajax session


【解决方案1】:

可以通过php方式实现。像

$expiry = 1800 ;//session expiry required after 30 mins
if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
    session_unset();
    session_destroy();
}
$_SESSION['LAST'] = time();

【讨论】:

  • 但是当页面重新加载时,`$_SESSION['LAST'] 会刷新它的值吗?导致我实际尝试使用倒数计时器时它只会在页面不再重新加载时运行..
  • 如果您将此代码添加到公用文件中,以确保每个页面加载,它将决定后端的注销。不过,我们可以在前端(JS)中添加定时器功能,我们可以实现它。
【解决方案2】:

在 ajax 代码的成功函数中,而不是从 php 文件中取出 echo 脚本

success: function(data){
         console.log('logout');
         window.location.href = '../index.php';
}

【讨论】:

  • 但它真的会破坏会话吗?它会将我重定向到我的主页,因为会话没有破坏。这就是为什么我在 echo 上使用 window.location.href 来检查是否会调用 session_destroy。
  • 是的,它会根据您在 ajax 期间调用的 php 代码破坏会话
  • 是的,我只是搞砸了我的 ajax 请求.. 但它可以工作.. 现在我必须在没有任何动作的情况下弄清楚.. 就像鼠标移动/点击按键...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2015-03-11
  • 2021-12-16
相关资源
最近更新 更多