如何使用jQuery和PHP检查空闲时间?

时间:2014-10-23 21:20:06

标签: javascript php jquery timeout idle-timer

我有一个使用PHP SESSION的脚本。我使用类管理PHP会话。在这个类中,我有一个方法,它返回会话到期前剩余的秒数。

此外,Evey时间用户刷新页面或打开新页面(对服务器的新请求)空闲时间计数器从$_SESSION['MA_IDLE_TIMEOUT'] = time()+900;开始

我要做的是在PHP会话到期前2分钟显示一条对话框消息,并检查用户是否仍在页面上。如果使用点击"继续工作"然后jQuery脚本将发送PHP AJAX请求以更新会话$_SESSION['MA_IDLE_TIMEOUT'] = time()+900;。如果用户没有点击任何内容或点击了"退出"然后会话结束,用户被重定向到登录页面。

我确实找到了一个很好的插件,它会在某种程度上完成作业jquery-idle-timeout

此插件的问题在于它使用JavaScript(如果使用键盘/鼠标)检查用户是否处于空闲状态。以下是这个脚本对我不起作用的事件:假设我的PHP会话有15分钟/ 900秒的限制。用户正在同一页面上阅读超长文章。他/她将滚动,他们并非真正闲置"从JavaScript角度来看"但从PHP的角度来看,使用是空闲的。然后用户刷新页面20分钟后,用户将被注销,因为他/她没有向PHP服务器发送超过900秒限制的新请求。

我该如何解决这个问题?有没有更好的插件来做这个伎俩?如果我在这个插件中遗漏了哪些内容可以解决我的问题?

由于

2 个答案:

答案 0 :(得分:2)

如果用户没有发出请求,并且没有移动鼠标或键盘或触摸设备等,那么从应用程序的角度来看,用户是空闲的"即使他们的眼球没有。

如果用户正在滚动,您可以使用javascript来监听滚动事件(例如,通过onscroll),但这不是100%可靠,因为(1)取决于javascript,并且(2)不会如果您正在查看短文或使用高/大格式显示器(例如可以旋转90度的显示器),则可以正常工作。

也许您可以采用不同的方式处理:使用Cookie,单点登录或类似技术预先验证或自动验证请求,以便用户的会话可以安全地死亡并重新启动,而无需用户手动登录

你可以处理这个问题的另一种方法是维持" ping"定期ping服务器的进程(例如通过setInterval())以使会话保持活动状态,并使用单独的超时(可能类似于"身份验证超时" ASP.NET使用)来保持跟踪"空闲"用户应该退出。然后用户动作,例如滚动,请求页面,聚焦字段,移动鼠标等,可以执行“重置”操作。将空闲计数器重置为0。

示例/概念 - 让读者练习完善它:

var idleTime = 0; // how long user is idle
var idleTimeout = 1000 * 60 * 20; // logout if user is idle for 20 mins
var pingFrequency = 1000 * 60; // ping every 60 seconds
var warningTime = 1000 * 60 * 2; // warning at 2 mins left
var warningVisible = false; // whether user has been warned
setInterval(SendPing, pingFrequency);
setInterval(IdleCounter, 1000); // fire every second
function IdleCounter() {
    idleTime += 1000; // update idleTime (possible logic flaws here; untested example)
    if (console) console.log("Idle time incremented. Now = " + idleTime.toString());
}

function SendPing() {
    if (idleTime < idleTimeout) {
        // keep pinging
        var pingUrl = "tools/keepSessionAlive.php?idleTime=" + idleTime;
        $.ajax({
            url: pingUrl,
            success: function () {
                if (console) console.log("Ping response received");
            },
            error: function () {
                if (console) console.log("Ping response error");
            }
        });

        // if 2 mins left, could show a warning with "Keep me on" button
        if ((idleTime <= (idleTimeout - (idleTimeout - warningTime))) && !warningVisible) {
            ShowTimeoutWarning();
        }
    } else {
        // user idle too long, kick 'em out!
        if (console) console.log("Idle timeout reached, logging user out..");
        alert("You will be logged off now dude");
        window.location.href = "logoff.aspx"; // redirect to "bye" page that kills session
    }
}

function ShowTimeoutWarning() {
    // use jQuery UI dialog or something fun for the warning
    // when user clicks OK set warningVisible = false, and idleTime = 0
    if (console) console.log("User was warned of impending logoff");
}

function ResetIdleTime() {
    // user did something; reset idle counter
    idleTime = 0;
    if (console) console.log("Idle time reset to 0");
}
$(document) // various events that can reset idle time
.on("mousemove", ResetIdleTime)
    .on("click", ResetIdleTime)
    .on("keydown", ResetIdleTime)
    .children("body")
    .on("scroll", ResetIdleTime);

答案 1 :(得分:1)

我使用时间cookie注销非活动用户,如下所示:

`$time = time();
// 5 minutes since last request
if(!empty($_COOKIE['_time'] && $time - $_COOKIE['_time'] >= 300) 
{
    // log user out
}
setcookie('_time', $time, '/');`

希望这有帮助。