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



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

此外,每当用户刷新页面或打开新页面(向服务器发出新请求)时,空闲时间计数器都会通过$_SESSION['MA_IDLE_TIMEOUT'] = time()+900; 启动

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

我确实找到了一个很好的插件,它会在一定程度上完成Job jquery空闲超时

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

我该如何解决这个问题?有更好的插件可以做到这一点吗?如果我在这个插件中遗漏了什么可以解决我的问题?

感谢

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

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

也许你可以用不同的方式处理:使用cookie、单次登录或类似技术来预验证或自动验证请求,这样用户的会话就可以安全地终止并重新启动,而无需用户手动登录。

处理此问题的另一种方法是维护一个"ping"进程,该进程定期对服务器进行ping(例如,通过setInterval())以保持会话有效,并使用单独的超时(可能类似于ASP.NET使用的"身份验证超时")来跟踪"空闲"用户何时应该注销。然后,用户操作,如滚动、请求页面、聚焦字段、移动鼠标等,可以进行"ping重置",将空闲计数器重置为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);

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

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

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新