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

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

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

依存関係の更新

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

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

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
		<version>3.0.4</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>io.lettuce</groupId>
		<artifactId>lettuce-core</artifactId>
		<version>6.2.1.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>6.0.13</version>
	</dependency>
</dependencies>

Spring XML 設定

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

src/main/webapp/WEB-INF/spring/session.xml
(1)
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

(2)
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
1Spring Session はまだ XML 名前空間のサポートを提供していないため、<context:annotation-config/> と RedisHttpSessionConfiguration の組み合わせを使用します(gh-104 [GitHub] (英語) を参照)。これにより、Filter を実装する springSessionRepositoryFilter という名前の Spring Bean が作成されます。このフィルターは、Spring Session によってサポートされる HttpSession 実装の置き換えを担当します。この場合、Spring Session は Redis によってサポートされています。
2Spring Session を Redis サーバーに接続する RedisConnectionFactory を作成します。デフォルトのポート (6379) でローカルホストに接続するように接続を構成します。Spring Data の構成の詳細については、リファレンスドキュメントを参照してください

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

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

Filter がその魔法を実行するには、Spring に session.xml 構成をロードするように指示する必要があります。これは、次の構成で実行できます。

src/main/webapp/WEB-INF/web.xml
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/spring/session.xml
	</param-value>
</context-param>
<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>

ContextLoaderListener は contextConfigLocation を読み取り、session.xml 構成を取得します。

最後に、サーブレットコンテナー(つまり、Tomcat)がすべてのリクエストに springSessionRepositoryFilter を使用するようにする必要があります。次のスニペットは、この最後のステップを実行します。

src/main/webapp/WEB-INF/web.xml
<filter>
	<filter-name>springSessionRepositoryFilter</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
	<filter-name>springSessionRepositoryFilter</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>

DelegatingFilterProxy (Javadoc) は、springSessionRepositoryFilter という名前で Bean を検索し、それを Filter にキャストします。DelegatingFilterProxy が呼び出されるすべてのリクエストに対して、springSessionRepositoryFilter が呼び出されます。

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

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

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

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

サンプルを機能させるには、ローカルホストで Redis 2.8+ をインストールします (英語) を実行し、デフォルトのポート (6379) で実行する必要があります。または、Redis サーバーを指すように RedisConnectionFactory を更新することもできます。もう 1 つのオプションは、Docker (英語) を使用してローカルホストで Redis を実行することです。詳細な手順については、Docker Redis リポジトリ (英語) を参照してください。
$ ./gradlew :spring-session-sample-xml-redis:tomcatRun

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

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

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

  • 属性名 : ユーザー名

  • 属性値 : rob

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

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

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

src/main/java/sample/SessionServlet.java
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 を使用する代わりに、Redis で値を永続化します。Spring Session は、ブラウザーに SESSION という名前の Cookie を作成します。その Cookie には、セッションの ID が含まれています。Cookie を表示できます(Chrome (英語) または Firefox [Mozilla] (英語) を使用)。

redis-cli を使用してセッションを削除できます。例: Linux ベースのシステムでは、次のように入力できます。

	$ redis-cli keys '*' | xargs redis-cli del
Redis のドキュメントには、redis-cli のインストール (英語) 手順が記載されています。

または、明示的なキーを削除することもできます。これを行うには、ターミナルに次のように入力します。必ず 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e を SESSIONCookie の値に置き換えてください。

	$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

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