Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

HttpSessionListener セッション作成と無効化の通知を受ける

HttpSessionListener を使って、セッション作成と無効化のタイミングで通知を受け取る方法を書いていきます。

バージョン

サーブレットのバージョンは以下の通りです。

動作確認用プロダクト

動作確認のために、以下の製品を使用しました。

目次

  1. 注意事項
  2. リスナーの作成
  3. サーブレットの作成
  4. ディレクトリ階層の作成
  5. pom.xml の作成
  6. 動作確認

1. 注意事項

セッション無効化の通知は、HttpSessionListener の以下メソッドを実装することで受け取ることができます。

sessionDestroyed(HttpSessionEvent se)

こちらのメソッドですが、

といった点に注意が必要です。

2. リスナーの作成

HttpSessionListener を実装するクラスを作成します。

org/example/listener/SessionListener.java

package org.example.listener;

import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;

@WebListener
public class SessionListener implements HttpSessionListener {
  // セッション作成時に呼び出されるメソッド
  @Override
  public void sessionCreated(HttpSessionEvent se) {
    System.out.print("リスナー:セッション作成の通知 [id=");
    System.out.print(se.getSession().getId());
    System.out.println("]");
  }

  // セッション無効化時に呼び出されるメソッド
  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    System.out.print("リスナー:セッション無効化の通知 [id=");
    System.out.print(se.getSession().getId());
    System.out.println("]");
  }
}

3, サーブレットの作成

動作確認をする場合、以下のクラスを作成します。

org/example/listener/CreateSessionServlet.java

package org.example.listener;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

@WebServlet("/create/session")
@SuppressWarnings("serial")
public class CreateSessionServlet extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException
  {
    // セッションを作成して、タイムアウトを5秒に設定
    HttpSession session = req.getSession();
    session.setMaxInactiveInterval(5);
    System.out.print("サーブレット:セッション作成 [id=");
    System.out.print(session.getId());
    System.out.println("]");
  }
}

4. ディレクトリ階層の作成

以下のコマンドで、プロジェクト sample-servletディレクトリ階層を作成します。

mkdir sample-servlet
cd sample-servlet
mkdir src\main\java
mkdir src\main\webapp\WEB-INF

作成したら、src/main/java 配下にコードを置きます。

5. pom.xml の作成

フォルダ sample-servletpom.xml を作成します。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>sample-servlet</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.4.0</version>
      </plugin>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>11.0.15</version>
        <configuration>
          <scan>1</scan>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

サーブレットコンテナを起動できるように、build で Jetty Plugin を定義しています。

6. 動作確認

以下のコマンドでコンテナを起動します。

sample-servlet> mvn jetty:run

ブラウザで、以下の URL を開きます。

http://localhost:8080/create/session

以下の文言が標準出力されます。

リスナー:セッション作成の通知 [id=node03go486wjlt54fk7ln0tgfrcy0]
サーブレット:セッション作成 [id=node03go486wjlt54fk7ln0tgfrcy0]

5秒以上経過してから、もう一度同じ URL を開きます。

リスナー:セッション無効化の通知 [id=node03go486wjlt54fk7ln0tgfrcy0]
リスナー:セッション作成の通知 [id=node0ofaophmb2nr51dyi3qi51ds1h1]
サーブレット:セッション作成 [id=node0ofaophmb2nr51dyi3qi51ds1h1]

上記のように、セッション無効化と作成の文言が出力されます。