1

ユーザーがログインできる Web アプリケーションがいくつかあります。ログアウト ボタンをクリックすると、いくつかのロジックを処理する必要があります。問題は、ほとんどのユーザーがログアウト ボタンをクリックせずにブラウザを閉じることです。ブラウザーを閉じるときにロジックを呼び出すために、次のことを試しました。

  1. フレームセットに「onbeforeunload」イベントを追加しました。ブラウザを閉じると、ログアウト機能が呼び出されます。
  2. ログアウト関数内で、primefaces p:remoteCommand コンポーネントを使用して、サーバー上のアクション リスナーを呼び出します。

現在のFirefoxバージョンではすべて正常に動作しますが、IE9にはいくつかの問題があります. IE9 でタブを閉じると、私のロジックが呼び出されます。ブラウザを閉じても機能しません。私の JS 関数が呼び出されますが、サーバーへの要求は実行されません。この問題を解決する方法はありますか? ところで: これが 100% の解決策ではないことはわかっていますが、まさにこの機能が必要です。私の関数と p:remoteCommand はそのように見えます。

function automaticLogout() {
    handleAutomaticLogout();
    alert('BlaBla');
}

<p:remoteCommand name="handleAutomaticLogout" actionListener="#{myBean.handleAutomaticLogout}" async="false" />
4

2 に答える 2

0

クライアント側の Javascript ソリューションが特に必要ですか、それともこれまでのやり方ですか?

サーバー側では@PreDestroy、バッキング Bean メソッドの上にアノテーションを配置すると、Bean が範囲外になる直前にそのメソッドが呼び出されます。

このアノテーションを使用してセッション( )を無効にするメソッドを作成するsession.invalidate()と、ユーザーが [ログアウト] をクリックせずにページを離れたときに呼び出されます。

バッキング Bean:

import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@ManagedBean
@SessionScoped
public class PreDestroyBean {

    //Called by button - log out perhaps?
    public void killTheSessionDeliberately() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        session.invalidate();
    }

    @PreDestroy
    public void revokeLicense() {
        System.out.println("PreDestroy method was called.");

    }
}

ページボタン:

<h:form>
    <p:commandButton id="killSession" value="Kill Session" 
            actionListener="#{preDestroyBean.killTheSessionDeliberately()}" update="@form" />
</h:form>
于 2012-07-24T21:36:37.073 に答える
0

onunload とともに p:remoteCommand を使用できます。例:

<body onunload="test();"> 
    <form id="exit">
       <p:remoteCommand  id="test" name="test" action="#{ContatoMB.teste}"/>
    </form>
</body>

http://forum.primefaces.org/viewtopic.php?f=3&t=15695を参照 すると、うまくいきます。

于 2016-06-24T15:07:54.350 に答える