繁体   English   中英

使用 Settimeout 警告并最终将用户重定向到非活动 session 不起作用

[英]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不会执行。

不幸的是,浏览器对话框是模态的,它们会冻结底层计时器:如果alertconfirm弹出窗口打开,您的sessionTimeoutTimer将不会执行

无法使用标准alertconfirm弹出窗口覆盖此行为 - 它内置在浏览器中,无法更改。

作为替代方案,您可以实现自己的弹出对话框而不是使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM