[英]Using Settimeout to warn and finally redirect user for inactive session not working
想法是警告用户 session 如果空闲 15 分钟将超时,并在 20 分钟后重定向到主页(要求不注销用户)。 目前在 15 分钟后出现警告。 我正在等待接下来的五分钟,但没有出现下一个警报。 请帮助我理解我在这里写错了什么。 是否要通过使用模态来完成警报消息?
var sessionTimoutWarning = 900000; // Display warning in 15 Min. var sessionTimout = 1200000; // Redirect in 20 minute. var sessionsessionWarningTimer; var sessionsessionTimeoutTimer; // Start timers. function StartTimers() { sessionWarningTimer = setTimeout("IdleWarning()", sessionTimoutWarning); sessionTimeoutTimer = setTimeout("IdleTimeout()", sessionTimout); } // Reset timers. function ResetTimers() { clearTimeout(sessionWarningTimer); clearTimeout(sessionTimeoutTimer); StartTimers(); } // Show idle timeout warning dialog. function IdleWarning() { // Logout the user. var toContinueSession = confirm("Warning:Session is going to expire in next 5 minutes due to inactivity. Press Ok to continue. Please save the changes made."); if (toContinueSession) { ResetTimers(); } else window.location.replace("../Default.aspx"); } function IdleTimeout() { alert("Session has already expired. Redirecting to Home Page."); window.location.replace("../Default.aspx"); }
<body style="max-width: 100%; height: 100%;" onload="StartTimers();">
编辑:如果用户想在弹出警告警报时单击“确定”继续,我正在重置计时器。 我期待的是在弹出警报消息并且用户仍在处理其他事情(不在此页面上)之后,5 分钟后应该出现第二个弹出窗口,说明 session 已经过期,即 IdleTimeout() 被调用,这没有发生。
您的 function ResetTimers
正在清除sessionTimeoutTimer
:
function ResetTimers() {
clearTimeout(sessionWarningTimer);
clearTimeout(sessionTimeoutTimer); // here you are going to reset sessionTimeoutTimer
StartTimers(); // this is going to restart times
}
function IdleWarning() {
// Logout the user.
var toContinueSession = confirm("Warning:Session is going to expire in next 5 minutes due to inactivity. Press Ok to continue. Please save the changes made.");
if (toContinueSession) { // if true then sessionTimeoutTimer is clearing as well
ResetTimers();
} else
window.location.replace("../Default.aspx");
}
要完成这项工作,您应该从 function ResetTimers
中删除clearTimeout(sessionTimeoutTimer)
。
您的问题是变量sessionTimoutWarning
的类型,因为您实际上将其声明为sessionsessionTimoutWarning
但将其用作sessionTimoutWarning
(一个会话)。 您还应该使用实际的 function 对象,而不是在调用超时时将它们包围在字符串中。 IE
setTimeout(IdleWarning, sessionTimoutWarning);
相比
setTimeout("IdleWarning()", sessionTimoutWarning);
尝试这个:
sessionsessionTimoutWarning = 900000; // Without "var" - make global
sessionTimout = 1200000; // Without "var" - make global
或方法#2:
window.sessionsessionTimoutWarning = 900000; // Without "var" - make global
window.sessionTimout = 1200000; // Without "var" - make global
用法:
//..
console.log(window.sessionTimout); // make sure is available
然后用 console.log ex 替换 alert。
console.log("Session has already expired. Redirecting to Home Page.");
如果一切正常,请使用控制台日志进行调试。
我认为问题在于您正在调用ResetTimers();
在IdleWarning()
中,这是取消sessionTimeoutTimer
。
看代码:
...
if (toContinueSession) {
ResetTimers();
} ...
和:
// Reset timers.
function ResetTimers() {
clearTimeout(sessionWarningTimer);
clearTimeout(sessionTimeoutTimer);
StartTimers();
}
如果用户在警报上单击“ OK
”,您将重新启动 20 分钟计时器。 如果他们没有点击OK
,那么他们会立即被重定向,所以你的超时代码永远不会执行。
我假设即使用户单击“ OK
”,您也不想重新启动sessionTimeoutTimer
,因为它仍应在 20 分钟截止日期后触发。
编辑以下 OP 评论
我现在了解到,如果用户没有注意到警报弹出窗口,您担心sessionTimeoutTimer
不会执行。
不幸的是,浏览器对话框是模态的,它们会冻结底层计时器:如果alert
或confirm
弹出窗口打开,您的sessionTimeoutTimer
将不会执行。
无法使用标准alert
或confirm
弹出窗口覆盖此行为 - 它内置在浏览器中,无法更改。
作为替代方案,您可以实现自己的弹出对话框而不是使用alert
,因此不会阻止计时器运行。 我想不出解决此问题的替代方法。
试试这个,我修改了一些部分
var sessionTimoutWarning = 900000; // Display warning in 15 Min.
var sessionTimout = 1200000; // Redirect in 20 minute. //change this to 5 min
var sessionsessionWarningTimer;
var sessionsessionTimeoutTimer;
// Start timers.
function StartTimers() {
sessionWarningTimer = setTimeout("IdleWarning()", sessionTimoutWarning);
}
function EndSession() //this will end the complete session
{
sessionTimeoutTimer = setTimeout(IdleTimeout(){
window.location.replace("../Default.aspx");
}, sessionTimout);
//redirect to the page in this function
}
// Reset timers.
function ResetTimers() {
clearTimeout(sessionWarningTimer);
// clearTimeout(sessionTimeoutTimer);
StartTimers();
}
// Show idle timeout warning dialog.
function IdleWarning() {
// Logout the user.
var toContinueSession = confirm("Warning:Session is going to expire in next 5 minutes due to inactivity. Press Ok to continue. Please save the changes made.");
if (toContinueSession) {
//here you get the event after the 15 min .
ResetTimers();
} else
{
// if he didn't continue then, call the session clear function
EndSession() //but in this changes have tge timer is 5 min because already 15 is completed .
}
}
function IdleTimeout() {
alert("Session has already expired. Redirecting to Home Page.");
}
<!-- language: lang-html -->
<body style="max-width: 100%; height: 100%;" onload="StartTimers();">
<!-- end snippet -->
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.