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

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

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

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

我找到了一个很好的插件,它会在某种程度上改变Job jquery-idle-timeout

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

我怎么解决这个问题? 有没有更好的插件来做这个伎俩? 如果我在这个插件中遗漏了哪些东西可以解决我的问题?

谢谢

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

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

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

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

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

 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, '/');` 

希望这可以帮助。