HttpSessionListenerインターフェースを利用すると、アプリケーションサーバ内でのセッションを監視し、生成と破棄のタイミングを検知することができます。
HttpSessionListenerインターフェースの実装によるセッション監視の仕方
検知するには、HttpSessionListenerインターフェースを実装したクラスを作成し、対象のWebアプリの「web.xml」に以下のような設定を追加すればOKです。
下記では、<listener>として、<listener-class>に記述している、
jp.co.pa-kun.listener.AppHttpSessionListenerクラスを設定しています。
<listener>
<listener-class>
jp.co.pa-kun.listener.AppHttpSessionListener
</listener-class>
</listener>
AppHttpSessionListenerクラスというのが、HttpSessionListenerインターフェースを実装したクラスですね。
実際に、AppHttpSessionListenerクラスの例を見てみましょう。
このクラスで定義するメソッドは、以下の2つです。
セッションが生成されたタイミングで呼ばれます。
セッションが破棄されたタイミングで呼ばれます。セッションが破棄されるのは、設定されたタイムアウトが経過したときと、明示的に、session.invalidate()メソッドが呼ばれてセッションが無効化されたタイミングです。
実装例
import java.util.Date;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import jp.co.koji.common.SessionHolder;
public class AppHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se)
{
HttpSession session = se.getSession();
System.out.print(getTime() + " Created session :ID="+ session.getId() + " for " + session.getMaxInactiveInterval());
}
public void sessionDestroyed(HttpSessionEvent se)
{
HttpSession session = se.getSession();
System.out.println(getTime() + " Destroyed session :ID=" + session.getId());
}
private String getTime()
{
return new Date(System.currentTimeMillis()).toString();
}
}
複数のリスナーを定義すれば、どちらの実装メソッドも呼ばれますが、呼ばれる順番が保障されているわけではないことに注意してください。