如果用户在一段时间内处于非活动状态,则强制注销用户

时间:2009-02-21 13:01:34

标签: php session

假设您正在进行银行应用程序。如果用户登录到您的站点,如何检测他们的不活动状态并要求他们在一段时间内保持不活动状态?这里处于非活动状态意味着他们要么切换到其他选项卡,要么不触摸浏览器应用程序。

我想我可以通过在用户在我的应用程序的每个页面上执行时注册每个鼠标移动或键盘移动来执行此操作。但是代码会非常难看并且难以维护。还有其他更优雅的方法吗?

9 个答案:

答案 0 :(得分:15)

嗨,大家好,这是我使用的代码。它不是我的,但我确实修改了它的'完美'。

// Add the following into your HEAD section
var timer = 0;
function set_interval() {
  // the interval 'timer' is set as soon as the page loads
  timer = setInterval("auto_logout()", 10000);
  // the figure '10000' above indicates how many milliseconds the timer be set to.
  // Eg: to set it to 5 mins, calculate 5min = 5x60 = 300 sec = 300,000 millisec.
  // So set it to 300000
}

function reset_interval() {
  //resets the timer. The timer is reset on each of the below events:
  // 1. mousemove   2. mouseclick   3. key press 4. scroliing
  //first step: clear the existing timer

  if (timer != 0) {
    clearInterval(timer);
    timer = 0;
    // second step: implement the timer again
    timer = setInterval("auto_logout()", 10000);
    // completed the reset of the timer
  }
}

function auto_logout() {
  // this function will redirect the user to the logout script
  window.location = "your_logout_script.php";
}

// Add the following attributes into your BODY tag
onload="set_interval()"
onmousemove="reset_interval()"
onclick="reset_interval()"
onkeypress="reset_interval()"
onscroll="reset_interval()"

Goo运气

理查德

答案 1 :(得分:7)

如果用户定期从您的服务器请求新的页面/数据,那么在PHP中调整会话超时应该适用于此(假设您正在使用PHP会话)。

如果担心的是他们可以在一个页面上坐一段很长的时间而没有去服务器(例如填写长表),并且你想区分这个和用户只需切换到另一个窗口,你可以做一些事情,比如使用javascript每五分钟左右使用XMLHTTPRequest请求一些数据,以使会话保持活跃状态​​。您可以在javascript中使用window.focus和window.onblur事件来停止并重新启动此机制(我认为IE存在一些差异,有一个很好的解释here)。

答案 2 :(得分:4)

一种非常简单有效的方法是将这样的内容放在HTML HEAD部分中:

<META HTTP-EQUIV="refresh" CONTENT="1800;URL=logout.php?timeout"> 

用适当的脚本替换logout.php?timeout。在上面的示例中,如果?timeout在查询字符串中,我会向他们显示一个登录页面,其中包含指示由于不活动而已注销的信息。

将1800替换为您希望在自动注销之前保持非活动状态的时间(以秒为单位)。将此设置为您将会话过期设置为的相同时间。

编辑 - 实现的另一个简单机制是拥有一个名为last_time或last_activity的会话变量,或者沿着这些行的某些东西,并在每次有活动时将其设置为时间戳。在我的大部分内容中,我都有一个通用的包含文件。在同一个文件中,您可以检查以确保它在您为活动会话设置的约束范围内。如果它太长了 - 只需执行300重定向到注销页面并在那里显示相应的不活动消息。

祝你好运!

伊恩

答案 3 :(得分:3)

我们现在可以将代码改进为jquery


idleTime = 0;
$(document).ready(function() {

    var idleInterval = setInterval("timerIncrement()", 60000); // 1 minute //60000
    $(this).mousemove(function(e) {
        idleTime = 0;
    });
    $(this).keypress(function(e) {
        idleTime = 0;
    });

});

function timerIncrement() {

    idleTime = idleTime + 1;

    if (idleTime >= 5) {
        window.location = $('#base_url').val() + 'home/logout_user';
    }
}

答案 4 :(得分:2)

您可以使用underscorejquery javascript库更优雅地完成这项工作 -

$('body').on("click mousemove keyup", _.debounce(function(){
    // logout user here
}, 1800000)) // 30 minutes inactivity

答案 5 :(得分:1)

首先取决于他们“登录”的方式。服务器上的会话到期是否为您执行此操作?如果你真的想手动做,那么你可以在setTimeout中使用一些javascript,但那很难看

答案 6 :(得分:0)

通常,会话生存期用于确定用户是否已登录。因此,您可以在会话中设置表示此状态的标志。如果它丢失了(用户还没有登录或会话超时),他被认为没有登录。

答案 7 :(得分:0)

您可以使用一些javascript每x分钟检查一次服务器,以查看用户上次活动的时间。不应该超过几行代码。如果用户禁用了javascript,我还会添加元刷新。

答案 8 :(得分:0)

我把时间戳'现在'并检查每次点击是否延迟小于3000秒或超过数十亿秒,这意味着用户刚刚登录,如果不是,它将重定向到注销

    var time = 0;

$(document).on('click', function() {

    var now = Date.now() / 1000 | 0;

    if (now - time < 3000 || now - time > 1480000000) {
        time = now;
    } else {
        window.location.replace("http://url");
    }
})