0

次の問題があります

許可されたページへのユーザー ナビゲーションを可能にするフィルターを使用します。それ以外の場合は、インデックスに派生します。

当たり前のことですが、1 つのブラウザーと 1 つのセッションであると言わなければなりません。さらに、ユーザーがブラウザまたはタブを閉じると、セッションが期限切れになります。

ユーザーが新しいタブを開いてそのうちの 1 つを閉じると、問題が発生します。これは、セッションが無効になり、他のタブがインデックスにリダイレクトされないことを意味します。これは、ajax イベントがないためです。

私がテストしたソリューションの1つ。

これはサーブレットに入るコードですが、実装方法については説明していません。

    public void trackUserTabs() {
    String onload = Controller.getParameter(ONLOAD_ID);
    if (onload != null && onload.trim().equals("true")) {
        openedTabs++;
        System.err.println("onload: " + controller.getCurrentPrinciple() + "..........." + openedTabs);
    }
    String onunload = Controller.getParameter(ONUNLOAD_ID);
    if (onunload != null && onunload.trim().equals("true")) {
        openedTabs--;
        System.err.println("onunload: " + controller.getCurrentPrinciple() + ".............." + openedTabs);
    }
    if (openedTabs <= 0 && controller.getCurrentProfile() != null) {
        /**
         * All tabs are closed, log out current user.
         */
        controller.logoutCurrentProfile();
    }

しかし、それには詳細があり、ユーザーがいつブラウザやタブを閉じたのか分からないかもしれません。

別の解決策。

  • ポーリングを使用して JavaScript で関数を呼び出し、これがログに記録されているかどうかを尋ねます。この機能を試してみましたが、良い結果は得られませんでした。

    function ComprobarSessionExpirada() {
    
    var request = false;
    if(window.XMLHttpRequest) { // Mozilla/Safari
        request = new XMLHttpRequest();
    } else if(window.ActiveXObject) { // IE
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    var url = '/ACP_3.0/pag/resumen.jsf';
    request.open('POST', url, true);
    request.onreadystatechange = function() {
        alert('a');
        if(request.readyState == 4) {
            var session = eval('(' + request.responseText + ')');
            if(session.valid) {
                alert('ok');
                // DO SOMETHING IF SESSION IS VALID
            } else {
                alert('Your Session has expired');
                window.location = '/ACP_3.0/index.jsf';
            }
        }
    }
    request.send(null);
    }
    

編集:

アプリケーションの Bean でユーザー情報を維持していることを忘れていました。これにより、チャットのユーザーのステータスを知ることができます。

そのため、ユーザーがセッションを直接 (ログアウト) 閉じるか、間接的に (ブラウザーを閉じるかタイムアウトするか) いつ閉じるかを識別する必要があります。セッションを閉じない場合、ユーザーのステータスは常にオンラインのままになるためです。

彼がいつログオフしたかを特定するために、セッションの破棄の前奏曲を使用します。メソッド sessionDestroyed がアプリケーション Bean でユーザーのステータスを変更する HttpSessionListener を実装します。

4

1 に答える 1

0

そう思うのは私だけではないだろう。セッションをタブに関連付けようとしないでください。ブラウザは目的のためにこのように設計されていません。

ほとんどの通常の使用例では、タブを閉じるとセッションが終了するという設計に悩まされます。ユーザーが最後のタブを誤って閉じてしまった場合はどうなりますか?

于 2013-01-10T08:15:09.763 に答える