0

Web アプリケーションを開発しました。ログアウト機能を追加したい。このために私は HttpSessionListener を使用しましたが、思い通りに動作しませんでした。

 import javax.servlet.http.HttpSessionListener;
 import javax.servlet.http.HttpSessionEvent;

 public class GetActiveSessions implements HttpSessionListener {

 private static int activeSessions = 0;

 public void sessionCreated(HttpSessionEvent se) {

 activeSessions++;
            System.out.println("+ 1 session");

 }


 public void sessionDestroyed(HttpSessionEvent se) {

 if(activeSessions > 0)

 activeSessions--;
            System.out.println("- 1 session");

 }


 public static int getActiveSessions() {
            System.out.println(activeSessions);

 return activeSessions;

 }

 }

sessionDestroyed() メソッドで (データベースを更新して) ユーザーのログアウトをマークしました。

セッションがタイムアウトの場合、コンテナーは sessionDestroyed() メソッドを呼び出し、データベースを更新しますが、明示的に session.invalidate() を呼び出すと (ユーザーがログアウト リンクをクリックすると)、値はセッション オブジェクトからバインド解除されますが、コンテナーは sessionDestroyed() メソッドを呼び出しません。そのため、データベースを更新できません。

また、ユーザーがブラウザ ウィンドウを閉じたときにユーザーをログアウトする必要もあります。

ユーザーがログアウトとしてマークされる可能性は 3 つあります。1. コンテナーごとのセッション タイムアウト。2. ユーザーはログアウト リンクをクリックします。 3 ユーザーはブラウザ ウィンドウを閉じます。

あなたの貴重なアイデアをお寄せください。

4

1 に答える 1

1

問題の回避策は、値がバインド解除されてデータベースが更新されるたびに HttpSessionBindingListener を使用することです。

ユーザーがブラウザーを閉じると、onunload イベントがトリガーされ、それぞれのサーブレットを呼び出して logoutUser() JavaScript 関数からユーザーをログアウト (データベースを更新) できます。

< script>

function logoutUser()

{

 // Call logout servlet 


}

< / script >
< / head >

< body onunload="logoutUser()" >

.....

onunload の 1 つの問題は、ページを更新してもトリガーされることです。

于 2012-10-15T07:32:34.387 に答える