4

ユーザーが自分のWebアプリにログインすると、セッションが作成されます。

session.setAttribute("SessionNumber","100");

そして、彼のユーザー名は、ONLINE_USERS. 他のオンラインユーザーが彼を見ることができるという名前のテーブルに追加されます。彼らはすべてのオンラインユーザーを見ることができます

ユーザーがログアウトボタンをクリックすると、その行がテーブルから削除され、次のコマンドを使用してセッションが削除されます。

session.invalidate();

しかし、ユーザーがブラウザに存在していたとすると、彼のセッションは終了しますが、行はオンラインユーザーとしてデータベースに残ります。これを回避するにはどうすればよいですか?

NetbeansでJSPサーブレットを使用しています。

4

3 に答える 3

6

HttpSessionListenerセッションの無効化時に表の行を削除するカスタムを有効にできます。

public class YourHttpSessionListener implements HttpSessionListener {       
   public void sessionCreated(HttpSessionEvent event) {
   //put row in the database
   }

   public void sessionDestroyed(HttpSessionEvent event) {
     //delete the row from database     
   }
}

web.xml でリスナーを宣言します。

<listener>
    <listener-class>YourHttpSessionListener</listener-class>
</listener>

ユーザーがブラウザを終了してから、サーバーでセッションが期限切れになるまでに遅延が発生することに注意してください。ただし、セッションの有効期限は構成可能です。適切な有効期限タイムアウトを見つける必要があります。長すぎないため、オフラインのユーザーがオンラインとして表示されなくなりますが、短すぎないため、接続しているユーザーがアイドル状態になることはありません。

servletこれは、ベーシックとjspテクノロジーを組み合わせて開発されたチャット アプリケーションにとって、良いトレードオフだと思います。

于 2012-09-01T21:05:35.193 に答える
1

まず、ブラウザを閉じたときにイベントをキャッチします

以下のjspのコードスニペットを試してjs関数をヒットし、ajax関数を呼び出してサーバー側コンポーネントをヒットすることができます。次に、セッションAPIを使用してセッションを無効にし、コードを追加してテーブルからレコードを削除します。

window.onbeforeunload = WindowClose; 

function WindowClose() { 

  //Write a AJAx request here to hit the server side servlet  to invalidate the session

}

または使用する

<body onunload="WindowClose(); >

サーバー側のコードでは、

HttpSessionセッション=request.getsession(); session.setMaxInactiveInterval(0); //またはsession.invalidate();

web.xmlでデフォルトのセッションタイムアウト値を定義して、ブラウザがクラッシュした場合に、規定の時間が経過した後にセッションが無効になるようにすることをお勧めします。

<session-config>
<session-timeout>30</session-timeout>
</session-config>
于 2012-09-02T12:45:14.357 に答える
1

現時点でWebサイトで操作しているユーザーを見たいと思っていることを理解しているように、HttpSessionListenerの問題は、セッションが破棄されるまでかなり長い間存続できるため、ユーザーがWebサイトを長時間使用していないときに破棄される可能性があることです. ( http://www.smartsoftwarebits.com/qaa/46-misc/82-how-to-set-session-timeout-for-tomcatを参照)

解決策: ユーザーが行った最後の要求のタイム スタンプを格納する列をデータベースに追加できます。この列を最新の状態に保つには、サーブレット フィルターを使用します。( http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html )

オンライン ユーザーをクリアするには、(たとえば Quartz を使用して) 5 分以上経過した行 (オンライン ユーザー) を削除するタイマー ジョブを追加します (したがって、最後の対話が 5 分より古い場合) ( http:// Quartz-scheduler.org/ )

これを使用すると、ユーザーが「まだそこにいる」かどうかを正確に判断できます。

さらに、クライアント側の JavaScript にタイマーを追加して、定期的に ajax 呼び出しを行うことができます。この方法で、ユーザーがブラウザを閉じずにしばらく非アクティブだった場合に対処できます。

于 2012-09-01T23:16:39.480 に答える