2011-01-27 11 views
1

私のアプリケーションでは、現在表示されているページに基づいてロック/ロック解除機能をいくつか作成しました。ユーザーはページを見ることができ、自分のデータベースに格納されているロックを取得します。ロックが解除されてデータベースが更新されると、そのデータベースはロックされます。JSF - ユーザーがブラウザウィンドウを終了したときに検出します。

ユーザーがログアウトせずにブラウザウィンドウを閉じるときに対応しようとしています。彼らはまだロックを保持していると私は解放される必要があり、データベース呼び出しが発生する必要があります。

Springやその他のものを使用してJSFアプリケーションでこれを処理する方法はありますか?

私はjavascript関数onbeforeunloadを知っていますが、私はデータベースを更新できるJavaメソッドを呼び出す必要があります。

答えて

1

unloadbeforeunloadイベントは、これらのイベントで発生したAjaxリクエストがサーバーに正常に到達することが保証されている仕様ではないため、ここでは役に立ちません。多くの場合、これ以上はありません。

最も信頼できる方法は、サーバー側のセッションの有効期間を非常に短く保つことです。 1分に設定し、ユーザーがの実際のセッションタイムアウトがを超えてアクティブにならないようになるまで、毎分(マイナスから数秒)までサーバーと同じセッション内でポーリングするページにajaxポーラーを導入します。ユーザのアクティビティは、JavaScriptキーボード(keyup)とマウス(click)イベントでリッスンすることでテストできます。

+0

ユーザーがブラウザウィンドウを終了した場合、それは現在のユーザーのセッションに存在するため失われたajaxポーラーの状態ではありませんか?これは正しい仮定でない場合、すべてがどのように機能するかについての知識の欠如かもしれません。 @BalusC – medium

+0

ポーラーは、セッションを生きたままにします。短いセッションの有効期間は、最後のポーリングの1分後に期限切れとなります。ユーザーがページを閉じると、ポーラーは停止し、セッションは終了します。実際、最大1分のギャップ期間がありますが、得られないギャップ期間よりも優れています。 – BalusC

+0

@PreDestroyについては、この状況では便利でしょうか? –

0

私は現在2つのウィンドウアプリケーションで作業しており、ウィンドウが閉じられたときを検出する必要がありました。

JSFアプリケーションはICEfacesを使用します。 ViewScoped Beanの注釈は@WindowDisposedです。このアノテーションを使用すると、ウィンドウが閉じられたときにViewScoped Beanの@PreDestroyメソッドが呼び出されます。

私はビュースケープされたbeanにバインドされた私のページに​​タグを含めました。これは、ウィンドウをクローズしてサーバサイドコードを実行するという点で機能します。

関連する問題