遇到会话超时问题

时间:2014-07-17 09:30:07

标签: javascript jquery session-timeout

需要您的宝贵意见。我已经实现了idletimeout功能,以便在用户空闲时会话将在3分钟后到期。

在三种情况下,我正在重置计时器。

  1. 点击或点按
  2. 处理过程中2秒后
  3. 滚动或滚动启动
  4. 问题是有时候会话在3分钟之前就会超时,即使我点击,点击或滚动也会将用户重定向到登录页面,即使该功能在点按或滚动时被调用,重置用户也会被调用。我正面临着找出漏洞的困难时期。

    我发布的代码;如果你发现任何事情,请告诉我。

       // Set timeout variables.
    var timoutNow = 180000 ;
    
    var ua = navigator.userAgent; 
    var event = ((ua.match(/iPad/i)) || (ua.match(/iPhone/i)) || (ua.match(/iPod/i))) ?    'touchstart' : 'click';
    
    var logoutUrl = Mobile+'/login.html'; // URL to logout page.
    
    var timeoutTimer;
    
    // Start timers.
    function StartTimers() {        
        timeoutTimer = setTimeout("IdleTimeout()", timoutNow);
        //console.log(timoutNow);
    
    }
    
    // Reset timers.
    function ResetTimers() {       
        clearTimeout(timeoutTimer);     
        StartTimers();       
    }
    
    // Processing time check.
    function Laodtimercheck()
            {
            setInterval(function(){ 
    
                 if($("body").hasClass("loading-processing")==true)
                 {
                    ResetTimers();              
                 }
            }, 2000);
            }   
    
    
    // Logout the user.
    function IdleTimeout() {
      sessionStorage.clear();
      document.location.href = Mobile+'/login.html';
    }
    
    $(document).live(event, function(){
            //console.log("Reset timers: ON TAP OR CLICK");
            ResetTimers();
    });
    
    $(document).mouseover(function() {
            //console.log("Reset timers: ONMOUSEOVER");
            ResetTimers();
    
    });
    $(window).scroll(function() {
            //console.log("Reset timers: SCROLL");
            ResetTimers();          
    });
    
    $(document).live("scrollstart", function(){
    //console.log("Reset timers: SCROLLSTART");
                    ResetTimers();
    });
    

    编辑:setTimeout只能工作两次;下次ResetTimers被调用但是setTimeout没有工作,或者我可能会在这里丢失一些东西,因为会话按照以前的两个调用时间超时....

1 个答案:

答案 0 :(得分:1)

你遇到的真正问题是:“ResetTimers”没有足够的调用。 为什么不被充分调用?我会尽力回答。

所有逻辑都没问题,只有少数例外。有两个“有问题”的事件不起作用,或者我认为不能像你想要的那样工作。

1.- LIVE(事件)

该事件永远不会被解雇。您无法将实时事件附加到文档,您需要指定节点,如html或body。

$("body").live(event, function(){
        //console.log("Reset timers: ON TAP OR CLICK");
        ResetTimers();
});

这就是为什么单击时计时器不会重置。 将变量用于绑定事件的另一种(并推荐)方法是使用.delegate()。 由于jQuery 1.4.3+是推荐的做法。

$(document).delegate("body", event, function(){
        //console.log("Reset timers: ON TAP OR CLICK (delegate)");
        ResetTimers();
});

其中任何一个(在身体上或代表身上)都会工作,计时器会在点击或点按事件时重置。

2.- MOUSEOVER

本次活动本身没有问题,但我认为这是不足够的。 MouseOver仅在指针第一次进入屏幕的位置触发,如果鼠标不离开窗口,鼠标悬停再也不会触发。也许,更好或添加控制“鼠标悬停”在文档上的方法是使用onmousemove事件。就像我之前在评论中所说的那样,我不知道你是否要对此严格要求,所以我给你一个提案,让我们看看它是否符合你的需求。

$(document).mouseover(function() {
        console.log("Reset timers: ONMOUSEOVER");
        ResetTimers();

});

在我的测试中,事件会引发很多事情,并且计时器会在每个事件上重置而不会出现问题。我希望它可以帮助你。