最新の安定バージョンについては、Spring Session 3.3.1 を使用してください!

Spring Session - HttpSession (クイックスタート)

このガイドでは、Spring Session を使用して、リレーショナルデータベースを透過的に活用し、Java 構成で Web アプリケーションの HttpSession をバックアップする方法について説明します。

依存関係の更新

Spring Session を使用する前に、依存関係を更新する必要があります。Maven を使用する場合は、次の依存関係を追加する必要があります。

pom.xml
<dependencies>
	<!-- ... -->

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-jdbc</artifactId>
		<version>3.0.4</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>6.0.13</version>
	</dependency>
</dependencies>

Spring Java 構成

必要な依存関係を追加した後、Spring 構成を作成できます。Spring 構成は、HttpSession 実装を Spring Session による実装に置き換えるサーブレットフィルターの作成を担当します。これを行うには、次の Spring 構成を追加します。

@Configuration(proxyBeanMethods = false)
@EnableJdbcHttpSession (1)
public class Config {

	@Bean
	public EmbeddedDatabase dataSource() {
		return new EmbeddedDatabaseBuilder() (2)
				.setType(EmbeddedDatabaseType.H2).addScript("org/springframework/session/jdbc/schema-h2.sql").build();
	}

	@Bean
	public PlatformTransactionManager transactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource); (3)
	}

}
1@EnableJdbcHttpSession アノテーションは、springSessionRepositoryFilter という名前の Spring Bean を作成します。その Bean は Filter を実装しています。このフィルターは、Spring Session によってサポートされる HttpSession 実装の置き換えを担当します。この場合、Spring Session はリレーショナルデータベースに支えられています。
2Spring Session を H2 データベースの組み込みインスタンスに接続する dataSource を作成します。Spring Session に含まれている SQL スクリプトを使用して、データベーステーブルを作成するように H2 データベースを構成します。
3 以前に構成された dataSource のトランザクションを管理する transactionManager を作成します。

データアクセス関連の関心事を構成する方法の詳細については、Spring Framework リファレンスドキュメントを参照してください。

Java サーブレットコンテナーの初期化

Spring の設定は、Filter を実装する springSessionRepositoryFilter という名前の Spring Bean を作成しました。springSessionRepositoryFilter Bean は、HttpSession を Spring Session によるカスタム実装に置き換えるロールを果たします。

Filter がその魔法を実行するために、Spring は Config クラスをロードする必要があります。最後に、サーブレットコンテナー(つまり、Tomcat)がすべてのリクエストに springSessionRepositoryFilter を使用するようにする必要があります。幸い、Spring Session は、AbstractHttpSessionApplicationInitializer という名前のユーティリティクラスを提供して、これらの両方の手順を簡単にします。次の例は、その方法を示しています。

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)

	public Initializer() {
		super(Config.class); (2)
	}

}
クラス(初期化子)の名前は関係ありません。重要なのは、AbstractHttpSessionApplicationInitializer を継承することです。
1 最初のステップは、AbstractHttpSessionApplicationInitializer を継承することです。そうすることで、springSessionRepositoryFilter という名前の Spring Bean がすべてのリクエストに対してサーブレットコンテナーに登録されます。
2AbstractHttpSessionApplicationInitializer は、Spring が Config を確実にロードするためのメカニズムも提供します。

複数の DataSources

Spring Session は @SpringSessionDataSource 修飾子を提供し、どの DataSource Bean を JdbcIndexedSessionRepository に注入するかを明示的に宣言できるようにします。これは、アプリケーションコンテキストに複数の DataSource Bean が存在するシナリオで特に役立ちます。

次の例は、その方法を示しています。

Config.java
@EnableJdbcHttpSession
public class Config {

	@Bean
	@SpringSessionDataSource (1)
	public EmbeddedDatabase firstDataSource() {
		return new EmbeddedDatabaseBuilder()
				.setType(EmbeddedDatabaseType.H2).addScript("org/springframework/session/jdbc/schema-h2.sql").build();
	}

	@Bean
	public HikariDataSource secondDataSource() {
		// ...
	}
}
1 この修飾子は、firstDataSource が Spring Session によって使用されることを宣言します。

httpsession-jdbc サンプルアプリケーション

このセクションでは、httpsession-jdbc サンプルアプリケーションの操作方法について説明します。

httpsession-jdbc サンプルアプリケーションの実行

サンプルを実行するには、ソースコードを取得し、次のコマンドを呼び出します。

$ ./gradlew :spring-session-sample-javaconfig-jdbc:tomcatRun

これで、localhost:8080/ でアプリケーションにアクセスできるようになります。

httpsession-jdbc サンプルアプリケーションの探索

これで、アプリケーションを使用してみることができます。これを行うには、フォームに次の情報を入力します。

  • 属性名 : ユーザー名

  • 属性値 : rob

次に、属性を設定するボタンをクリックします。これで、テーブルに表示された値が表示されます。

それはどのように機能しますか?

次のリストに示す SessionServlet の標準 HttpSession と対話します。

src/main/java/sample/SessionServlet.java
@WebServlet("/session")
public class SessionServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		String attributeName = req.getParameter("attributeName");
		String attributeValue = req.getParameter("attributeValue");
		req.getSession().setAttribute(attributeName, attributeValue);
		resp.sendRedirect(req.getContextPath() + "/");
	}

	private static final long serialVersionUID = 2878267318695777395L;

}

Tomcat の HttpSession を使用する代わりに、H2 データベースに値を保持します。Spring Session は、ブラウザーに SESSION という名前の Cookie を作成します。その Cookie には、セッションの ID が含まれています。Cookie を表示できます(Chrome (英語) または Firefox [Mozilla] (英語) を使用)。

必要に応じて、localhost:8080/h2-console/ で入手可能な H2 Web コンソールを使用してセッションを削除できます(JDBC URL には jdbc:h2:mem:testdb を使用します)。

これで、localhost:8080/ のアプリケーションにアクセスして、追加した属性が表示されなくなったことを確認できます。