Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过浏览器检测用户的不活动-纯粹通过javascript_Javascript_Javascript Events_Session Timeout - Fatal编程技术网

通过浏览器检测用户的不活动-纯粹通过javascript

通过浏览器检测用户的不活动-纯粹通过javascript,javascript,javascript-events,session-timeout,Javascript,Javascript Events,Session Timeout,在构建监视器时,它将监视用户在浏览器上的任何活动,如单击按钮或在文本框上键入(而不是将鼠标悬停在文档上)。因此,如果用户长时间没有活动,会话将超时 我们需要在没有jquery之类的东西的情况下完成它。我可以使用ajax。另一端的java servlet更可取。要跟踪空闲时间,并在空闲时间达到一定限制时执行一些操作,您可以相应地修改并使用 var IDLE_TIMEOUT = 60; //seconds var _idleSecondsCounter = 0; document.onclick =

在构建监视器时,它将监视用户在浏览器上的任何活动,如单击按钮或在文本框上键入(而不是将鼠标悬停在文档上)。因此,如果用户长时间没有活动,会话将超时

我们需要在没有jquery之类的东西的情况下完成它。我可以使用ajax。另一端的java servlet更可取。

要跟踪空闲时间,并在空闲时间达到一定限制时执行一些操作,您可以相应地修改并使用

var IDLE_TIMEOUT = 60; //seconds
var _idleSecondsCounter = 0;
document.onclick = function() {
    _idleSecondsCounter = 0;
};
document.onmousemove = function() {
    _idleSecondsCounter = 0;
};
document.onkeypress = function() {
    _idleSecondsCounter = 0;
};
window.setInterval(CheckIdleTime, 1000);

function CheckIdleTime() {
    _idleSecondsCounter++;
    var oPanel = document.getElementById("SecondsUntilExpire");
    if (oPanel)
        oPanel.innerHTML = (IDLE_TIMEOUT - _idleSecondsCounter) + "";
    if (_idleSecondsCounter >= IDLE_TIMEOUT) {
        alert("Time expired!");
        document.location.href = "logout.html";
    }
}
此代码将在显示警报和重定向之前等待60秒,任何操作都将“重置”计数-鼠标单击、鼠标移动或按键

它应该尽可能地跨浏览器,并且是直截了当的。如果将ID为SecondsUntilExpire的元素添加到页面中,它还支持显示剩余时间


Ref:

您建议的方法的问题是会话将超时,即使用户正在移动鼠标或键入输入。因此,如果您将会话超时设置为20分钟,并且用户持续键入21分钟,则会话仍将超时,即使会话处于“活动”状态。唯一能防止会话超时的是对服务器的新请求

解决方案1:让服务器控制会话超时

除非您在后台发出Ajax请求,这将持续更新会话,否则您可以在页面加载时设置JavaScript超时,并以这种方式提醒用户。除非您在用户在您的页面上时向服务器发出其他请求,否则无需使其变得困难:

setTimeout(function () {
   alert("You've timed out baby!");
}, 1200000); // 20 minutes in millisec (modify to your session timeout)
如果用户访问另一个页面或重新加载该页面,则会续订会话并重置JavaScript计时器。如果用户没有这样做,会话将在用户收到警报的同时超时

解决方案2:让客户端控制会话超时

如果您希望JavaScript完全控制会话持续的时间,以便在用户键入、移动鼠标或其他操作时更新会话,那么您也必须在后台向服务器发出Ajax请求,以便更新会话。(这可能是一个空的虚拟请求,只是一些命中服务器的请求)


<>你必须跟踪你认为“用户活动”的所有动作(ANHSIRK建议在他的回答中的一种方式),并且每当发生这样的事件时重置超时定时器。如果用户长时间处于非活动状态,则必须向服务器上的某个页面发出Ajax请求,从而使会话无效,然后可以提醒用户会话已超时。

您是在发出Ajax请求,还是由于什么原因使会话无法自行超时?会话超时时间间隔将以web.xml格式显示(在java应用程序中)我们可以进行ajax调用(我不知道是为了什么目的,很可能是为了使会话无效)。如果用户空闲时间超过web.xml中指定的时间间隔,我们将发出一条消息提醒您已超时宝贝!下面选择的答案取自此stackoverflow答案。我更喜欢这个问题,因为它没有提到IE。为什么不使用
monitorEvents(窗口);
?设置间隔对我来说很不稳定,为什么?url不工作。签出