0

JSF/PrimeFaces、Spring、および Hibernate を使用するアプリケーションでは、ユーザーがログインすると、ユーザーがアプリケーションからログアウトするか、セッションが期限切れになるまで、DB にフラグを設定します。問題は、適切にログアウトせずにブラウザーを閉じただけの場合でも、DB でこのフラグをクリアする必要があることです。これを達成するために、私はすでにjquery$window.unload$window.bind関数を試しました。これらの関数は、関連するJS関数を実際に<p:remoteCommand>呼び出し、マネージドBeanメソッドを呼び出してDBをクリアします。しかし、後でこれが信頼できないことを知り、テスト中にもイベントが一貫して発生していないことがわかりました。とにかくDBのクリーンアップを達成するにはどうすればよいですか?

4

1 に答える 1

1

ブラウザを閉じて聞くのは信頼できません。そのためにイベントを使用できますbeforeunloadが、これは世界が認識しているすべての Web ブラウザーでサポートされているわけではなく、エンドユーザーが無効化/スプーフィング/ハッキングすることさえできます。それなら、ajax リクエストの実行中の競合状態について話しているのではありません。ブラウザが閉じられる直前に、ajax リクエスト全体が到着するでしょうか? 多くの場合、これは当てはまらず、ブラウザーを閉じると ajax 要求が優先されます。

代わりに、セッションの有効期限でサーバー側をリッスンしてください。

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession session = event.getSession();
        // Do your job here. 
        // ...
    }

}

これは、プログラムによるログアウト中にExternalContext#invalidateSession()(または)を明示的に呼び出した場合にも呼び出されることに注意してください。HttpSession#invalidate()

于 2013-06-19T12:01:55.800 に答える