2

我的站点设置了超时,因此在 15 分钟不活动后,会出现一个登录屏幕,要求您刷新会话。

这很好用,但是如果您在网站上打开了多个窗口,则意味着将使用登录详细信息刷新一个页面,但不会刷新另一个页面。

所以问题是这样的,有没有办法在站点上打开的每个窗口上执行以下代码?

$jq('#loginbox').hide()

谢谢你的帮助。我还应该声明其他窗口不会通过 JavaScript 打开,用户可能只是在链接上单击在新窗口/选项卡中打开

4

4 回答 4

3

你不能访问你没有用 JS 打开的窗口。

每个窗口都应该检测到它超时并显示一个登录对话框。如果用户在窗口 A 登录,则窗口 B 应该轮询服务器以检测是否已创建会话,并在这种情况下自行恢复。

于 2012-06-25T20:19:21.460 回答
2

在切换到刷新屏幕(弹出?)之前,您可以简单地对服务器进行 ajax 调用以查看用户上次刷新的时间 - 如果用户仍然合法登录,只需将计时器重置为适当的时间。

于 2012-06-25T20:17:57.943 回答
1

如果另一个窗口不是通过 JavaScript 打开的,您将无法以编程方式访问它。换句话说,原始窗口将无法调用另一个窗口上的 JavaScript 函数。

但是,如果它们具有相同的域(如果它们在同一个网站上),它们可以共享 cookie。因此,一种可能性是让另一个窗口轮询会话 cookie 的更新,原始窗口可以写入该会话 cookie。一旦会话 cookie 获得特定值,另一个窗口就可以检测到这种变化并按照您认为合适的方式做出反应。

于 2012-06-25T20:24:19.180 回答
0

感谢所有发布想法的人,我选择了以下解决方案,如果有人可以增强它并发布代码,那么我会接受它作为答案:

$jq(function(){
    $jq(window).bind('blur', function(){checkloginrefreshed();});
    $jq(window).bind('focus', function(){checkloginrefreshed();});
    $jq(document).bind('focusout', function(){checkloginrefreshed();});
    $jq(document).bind('focusin', function(){checkloginrefreshed();});
});
function createCookie(name,value,hours) {
    if (hours) {
        var date = new Date();
        date.setTime(date.getTime()+(hours*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}

function checkloginrefreshed(){
    if (parseInt(readCookie("loginset")) == 1){
        eraseCookie("loginset");        
        $jq('#timeoutwarning').dialog("close");
        $jq('#timeoutwarning').html(TIMEOUTLOGINFORM);

        clearTimeout(timer);
        clearTimeout(timerWarning);

        setupTimers();
    }
}
于 2012-06-26T12:57:09.533 回答