0

Java EE と JSF 2.0 を使用する私のアプリケーションでは、ユーザーがアプリケーションのタブを閉じるとセッションが終了するようにしたいと考えています。このユーザーがアプリケーションで別のタブを開いた場合、この別のタブのセッションを閉じてはなりません。これは、アプリケーションの管理を妨げないようにするためです。

私が使用するセッションを終了するには:

public String deconnecter() {
    //invalidate user session
    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
    session.invalidate();
    return "login";
}
4

2 に答える 2

2

これはあなたが望む方法では不可能です。同じブラウザ インスタンスのすべてのウィンドウ/タブは、同じセッションを共有します。

とにかくこれを実現するには、条件付きでレンダリングされたインクルードと、ビューに関連するすべてを格納し、常にvoidまたはnullアクションメソッドから戻るビュースコープ Bean を使用して単一のビューを作成する必要があります。この方法では、セッション スコープはまったく必要ありません。新しいビューを作成するには、新しい GET リクエスト (新しいタブなど) を送信するか、nullアクション メソッドから非文字列を返します。

于 2012-08-01T18:08:50.533 に答える
1

おそらくこれは遅すぎますが、これに関連するウェブ上で多くの質問を見たので、クロムとファイアフォックスでテストしたソリューションをここに置くことができます(ただし、すべての最新版)

セットで: より洗練された解決策はフィルターを使用することですが、私は prerender イベントを使用しました (Web サイト全体に単一のテンプレートを使用するため、すべてのページがいつ読み込まれるかを追跡でき、テンプレートで prerender イベントを指定しました)。

Javascript セクション:

    window.onbeforeunload = function(){
      //log out of the server too.
      var xmlhttp;
      if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
      }
      else
      {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
      var url = '/context/index.xhtml?onunload=true';
      xmlhttp.open('GET', url, true);
      xmlhttp.send();
    }
     window.onload = function(){
      console.log('window name: '+window.name);
      if(window.name != '#{controller.sessionId}'){
        window.name = '#{controller.sessionId}';
        var xmlhttp;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        var url = '/context/index.xhtml?onload=true';
        xmlhttp.open('GET', url, true);
        xmlhttp.send();
      }
    }
    //Called when user logs out.
    function onLogout(){
      console.log('logging out: '+window.name);
      window.name = '';
      console.log('logged out: '+window.name);
    }

サーバー側コード:

このメソッドは、ビューが prerender イベントでレンダリングされる前に呼び出されます

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();
}

}

ajax リクエストの JavaScript コードは、Stackoverflow の回答を参考にしています。

于 2012-12-05T06:02:13.113 に答える