次の問題があります
許可されたページへのユーザー ナビゲーションを可能にするフィルターを使用します。それ以外の場合は、インデックスに派生します。
当たり前のことですが、1 つのブラウザーと 1 つのセッションであると言わなければなりません。さらに、ユーザーがブラウザまたはタブを閉じると、セッションが期限切れになります。
ユーザーが新しいタブを開いてそのうちの 1 つを閉じると、問題が発生します。これは、セッションが無効になり、他のタブがインデックスにリダイレクトされないことを意味します。これは、ajax イベントがないためです。
私がテストしたソリューションの1つ。
- タブが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 を実装します。