2016-12-21 13 views
0

私のWebアプリケーションは、ユーザーの活動を追跡するために、ユーザーのログインとログアウトをデータベーステーブルに記録します。Tomcatのセッションの期限切れの戦略

これは、ユーザーが明示的にログインまたはログアウトしたときにうまく機能します。これは、基になる認証コードがこれらのログイベントを処理するためです。

ただし、ユーザーがコンピュータを30分間アイドル状態にしておくと、Webセッションの有効期限が切れ、対応するログアウトイベントがないLoginイベントが1つ発生します。

私がこれを解決するために考えた唯一の戦略は、web.xmlで定義された30分前にトリガーされ、セッションが終了する前にユーザーをキックするjavascriptイベントを持つことです。しかし、これにはjavascriptの必要性の制限があり、複数のタブを使用すると予期しない結果が生じることがあります(つまり、ユーザーはtab2を使用しており、セッションはtab1で期限切れです)。

この場合、あなたは何をお勧めしますか?

答えて

1

あなたはHttpSessionListenerを使用します。これはまさにこのような状況のためにサーブレット仕様によって定義された標準インターフェースです。

警告については下記を参照してください。

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

public class LogoutListener implements HttpSessionListener { 
    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
    HttpSession session = event.getSession(); 
    // NOTE: You need to store some kind of user identification 
    //  in the session. My example just has a "username" 
    //  in here. 
    String username = session.getAttribute("username"); 

    // If the username is null, there was no logged-in user 
    // to log-out (e.g. non-authenticated user). 
    if(null != username) { 
     // NOTE: Obviously, this needs to call your existing 
     //  "logout"-recording code. Just an example. 
     MyDBUtilities.registerLogout(username, System.currentTimeMillis()); 
    } 
    } 

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

あなたは上記のコードを使用している場合は、明示的にログアウトしていないユーザーは、単一のログアウトレコードを取得し、明示的にログアウトしないユーザーがを取得することがわかります。どうして? 「ログアウト」アクションを使用して「ログアウト」レコードを書き込んだ後、すぐにセッションリスナーが実行され、2回目の監査エントリが作成されるためです。

あり、この問題には2つの明白なソリューションです:

  1. 停止はあなたの「ログアウト」アクションでログアウトイベントを記録するには、イベントハンドラが
  2. ユーザの「ユーザ名」を削除すべてログアウトを記録してみましょうセッション属性をログアウトするとイベントハンドラはイベントを無視します
関連する問題