JavaのHttpSessionListenerのsessionDestroyedメソッドとは?初心者でもわかるセッション終了処理の基本
生徒
「JavaのWebアプリケーションで、ユーザーのセッションが終わったときに何か処理を実行する方法ってあるんですか?」
先生
「ありますよ。それにはHttpSessionListenerインターフェースのsessionDestroyedメソッドを使えば、セッション終了時に自動で処理が呼び出されます。」
生徒
「セッションが切れたときにログを出したり、データベースを更新したりもできますか?」
先生
「もちろんできますよ。それでは、sessionDestroyedメソッドの基本的な使い方を見ていきましょう!」
1. HttpSessionListenerとは
Javaのjavax.servlet.http.HttpSessionListenerインターフェースは、Webアプリケーションでユーザーセッションの生成と破棄を監視するために用意された仕組みです。
このインターフェースを実装することで、サーバー側でセッションが作られたときや削除されたときに特定の処理を実行することができます。セッションのライフサイクルを管理するために非常に便利な機能です。
2. sessionDestroyedメソッドとは
sessionDestroyedメソッドは、HttpSessionListenerに定義されているメソッドのひとつで、ユーザーのセッションが無効になったときに自動で呼び出されます。
このメソッドを使えば、セッション終了時にログを記録したり、リソースを解放したり、データベースに情報を保存したりといった処理を実装できます。
3. セッションが破棄されるタイミング
セッションは以下のようなタイミングで破棄されます:
- セッションタイムアウトが発生したとき
- 明示的に
session.invalidate()が呼ばれたとき - Webアプリケーションが停止または再起動されたとき
これらのどのケースでも、sessionDestroyedメソッドは呼び出されます。
4. sessionDestroyedメソッドの基本実装
以下にsessionDestroyedメソッドを使ったHttpSessionListenerの基本的なコード例を紹介します。
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
public class MySessionDestroyLogger implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
// 省略:セッション生成時の処理
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
String sessionId = event.getSession().getId();
System.out.println("セッションが破棄されました: " + sessionId);
}
}
5. セッション属性を使った処理の例
セッションに保存されたデータを使って、終了時にログ記録やデータベース更新を行うことも可能です。以下はセッションからユーザー名を取得してログに出力する例です。
@Override
public void sessionDestroyed(HttpSessionEvent event) {
Object user = event.getSession().getAttribute("username");
System.out.println("セッション終了 - ユーザー名: " + user);
}
6. web.xmlやアノテーションでの登録
HttpSessionListenerをServletアプリケーションで有効化するには、以下のどちらかでリスナーを登録します。
web.xmlに記述する方法:
<listener>
<listener-class>com.example.MySessionDestroyLogger</listener-class>
</listener>
@WebListenerアノテーションを使う方法:
import jakarta.servlet.annotation.WebListener;
@WebListener
public class MySessionDestroyLogger implements HttpSessionListener {
// 上記と同じ実装
}
7. セッション終了処理で注意すべきこと
sessionDestroyedメソッド内で重い処理や長時間かかる通信処理を実行すると、Webサーバー全体のパフォーマンスに悪影響を与える場合があります。
そのため、実行する処理はできるだけ軽量にし、ログ記録やフラグ更新など最小限の内容に留めるのが一般的です。
8. アクティブセッション数の管理にも活用できる
sessionCreatedとsessionDestroyedを組み合わせて使うことで、現在のアクティブセッション数をリアルタイムにカウントすることが可能になります。
たとえば、セッションが作られるたびにカウントをインクリメントし、破棄されるたびにデクリメントすれば、現在ログイン中のユーザー数などを管理できます。