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関数を呼び出すことができなくなります。

ただし、ウィンドウが同じドメインを持っている場合(同じWebサイト上にある場合)、ウィンドウはCookieを共有できます。したがって、1つの可能性は、元のウィンドウが書き込むことができるセッション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 に答える