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