jquery/javascript创建一个注销计时器

jquery/javascript creating a logout timer

本文关键字:一个 注销 计时器 javascript 创建 jquery      更新时间:2023-09-26

我一直在尝试创建一个计时器,当我的客户端被idol超过10分钟时,该计时器会将其注销。我已经创建了下面的代码,只要用户不打开第二个选项卡,它就可以正常工作。我有很多客户端打开第二窗口或选项卡,当第二个标签打开时,计数器会加快速度。我正在寻找一种方法来改进以下代码,以便选项卡/窗口能够更好地同步。

var cookies='off'; // var to check if cookies are turned off
var alertTimes=0; // alturnative to cookies
$(function(){
    resetCookies();
    var loginTime=getCookie("loginTime");
    if (loginTime!=null && loginTime!=""){ cookies='on'; }
    checkAlerts();
});
function resetCookies(){
    setCookie("loginTime",'10',1);
    alertTimes=0;
}
function checkTime() {
    if(cookies=='on'){
        var loginTime=getCookie("loginTime");
        if (loginTime!=null && loginTime!=""){ 
            var newTime=loginTime-1;
            if(newTime==0){ autoLogout(); return false;}
            setCookie("loginTime",newTime,1);
        }else{ autoLogout(); return false;}
    }else{
        alertTimes++;
        if(alertTimes>=10){ autoLogout(); return false;}
    }
    setTimeout(checkTime, 600000);
}
function setCookie(c_name,value,exdays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}
function getCookie(c_name){
  var i,x,y,ARRcookies=document.cookie.split(";");
  for (i=0;i<ARRcookies.length;i++){
    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
    x=x.replace(/^'s+|'s+$/g,"");
    if (x==c_name){ return unescape(y); }
  }
}
function autoLogout(){
    window.location.href=("logout.php");
}

也许这个例子能满足您的需求?

( function ( $ ) {
  $.loginTimeout = function ( options ) {
    var opts = $.extend( {}, $.loginTimeout.defaults, options ),
    callback = function() {
      $.getJSON( opts.url, function ( data ) {
        if(data.status === "signed_out")
        document.location = opts.redirectTo;
      });
    };
    setInterval( callback, opts.timeout * 1000 );
  };
  $.loginTimeout.defaults = {
    timeout: 60,
    redirectTo: "/login",
    url: "/check_login"
  };
} ( jQuery ) );
// ...
$.loginTimeout({
  redirectTo: "/users/sign_in",
  url: "/users/check_status"
});

还要记住,在这个示例中,服务器应用程序正在决定用户会话是否已过期

您给出的代码就快到了。我的代码也需要同样的东西。我在cookie中添加了信息(上次修改),并将其与当前时间进行比较。如果两者之间有足够的空间(在本例中为1秒),则修改cookie信息。即使打开了15个选项卡,这也能起作用
我检查了他们是否打开了cookie。

$(function(){
    resetCookies();
    setTimeout(checkTime, 1000);
});
function resetCookies(){
    setCookie("loginTime",'10',1);
}
function checkTime() {
    var arrloginTime=getCookie("loginTime").split("--");
    var loginTime=arrloginTime[0];
    var dtmLastMod=new Date(arrloginTime[1]);
    console.log(loginTime);
    if (loginTime!=null && loginTime!=""){ 
        var dtmNow = new Date();
        if ((dtmNow.getTime() - dtmLastMod.getTime()) >= 1000){
            var newTime=loginTime-1;
            if(newTime==0){ autoLogout(); return false;}
            setCookie("loginTime",newTime,1);
        }
    }else{ autoLogout(); return false;}
    setTimeout(checkTime, 1000);
}
function setCookie(c_name,value,exdays){
    var exdate=new Date();
    var dtmLastMod = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + "--" + dtmLastMod + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}
function getCookie(c_name){
  var i,x,y,ARRcookies=document.cookie.split(";");
  for (i=0;i<ARRcookies.length;i++){
    x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
    y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
    x=x.replace(/^'s+|'s+$/g,"");
    if (x==c_name){ return unescape(y); }
  }
}
function autoLogout(){
    console.log('You have been logged out of this document due to inactivity.');
}