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

时间:2013-02-18 15:16:27

标签: javascript jquery

我一直在尝试创建一个计时器,当他们偶像超过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");
}

2 个答案:

答案 0 :(得分:1)

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

( 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"
});

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

答案 1 :(得分:0)

你提供的代码几乎就在那里。我的代码需要同样的东西。我向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.');
}