0

クライアントが 10 分以上アイドル状態になったときにクライアントをログアウトするタイマーを作成しようとしています。ユーザーが 2 番目のタブを開かない限り正常に動作する以下のコードを作成しました。2 番目のウィンドウまたはタブを開くクライアントが多数あり、2 番目のタブが開いている間、カウンターの速度が上がります。タブ/ウィンドウがより適切に同期されるように、次のコードを改善する方法を探しています。

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

2 に答える 2

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

また、この例では、サーバーアプリケーションがユーザーセッションの有効期限が切れているかどうかを判断していることにも注意してください。

于 2013-02-18T15:22:24.120 に答える
0

あなたが与えたコードはほとんどそこにありました。私のコードにも同じことが必要でした。Cookie に情報を追加し (最終変更時刻)、それを現在の時刻と比較します。間に十分なスペースがある場合 (この場合は 1 秒)、Cookie 情報を変更します。これは、15 個のタブを開いている場合でも機能します。
クッキーがオンになっているかどうかを確認しました。

$(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.');
}
于 2013-08-21T18:45:35.440 に答える