Spring Session - Spring Boot
このガイドでは、Spring Boot を使用するときに、Spring Session を使用して Redis を透過的に活用し、Web アプリケーションの HttpSession
をバックアップする方法について説明します。
完成したガイドは、Boot サンプルアプリケーションにあります。 |
依存関係の更新
Spring Session を Redis とともに使用する前に、適切な依存関係があることを確認する必要があります。動作する Spring Boot Web アプリケーションを使用していることを前提としています。
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
implementation("org.springframework.session:spring-session-data-redis")
Spring Boot は Spring Session モジュールの依存関係管理を提供するため、依存関係のバージョンを明示的に宣言する必要はありません。
Spring Boot の設定
必要な依存関係を追加した後、Spring Boot 構成を作成できます。ファーストクラスの自動構成サポートのおかげで、依存関係を追加するだけで、Spring Boot が Redis をサポートする Spring Session をセットアップします。
内部的には、Spring Boot は、@EnableRedisHttpSession
アノテーションを手動で追加するのと同等の構成を適用します。これにより、Filter
を実装する springSessionRepositoryFilter
という名前の Spring Bean が作成されます。このフィルターは、Spring Session によってサポートされる HttpSession
実装の置き換えを担当します。
次のように、application.properties
を使用すると、さらにカスタマイズできます。
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds is used. spring.session.redis.flush-mode=on_save # Sessions flush mode. spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.
詳細については、Spring Boot ドキュメントの Spring Session (英語) の部分を参照してください。
Redis 接続の構成
Spring Boot は、Spring Session をローカルホスト上の Redis サーバーのポート 6379(デフォルトポート)に接続する RedisConnectionFactory
を自動的に作成します。本番環境では、Redis サーバーを指すように構成を更新する必要があります。例: application.properties に以下を含めることができます。
spring.data.redis.host=localhost # Redis server host. spring.data.redis.password= # Login password of the redis server. spring.data.redis.port=6379 # Redis server port.
詳細については、Spring Boot ドキュメントの Redis への接続 (英語) の部分を参照してください。
サーブレットコンテナーの初期化
Spring Boot の設定は、Filter
を実装する springSessionRepositoryFilter
という名前の Spring Bean を作成しました。springSessionRepositoryFilter
Bean は、HttpSession
を Spring Session によるカスタム実装に置き換えるロールを果たします。
Filter
がその魔法を実行するために、Spring は Config
クラスをロードする必要があります。最後に、サーブレットコンテナー(つまり、Tomcat)がすべてのリクエストに springSessionRepositoryFilter
を使用するようにする必要があります。幸い、Spring Boot がこれらの両方の手順を実行してくれます。
Boot サンプルアプリケーション
Boot サンプルアプリケーションは、Spring Boot を使用するときに、Spring Session を使用して Redis を透過的に活用し、Web アプリケーションの HttpSession
をバックアップする方法を示しています。
Boot サンプルアプリケーションの実行
サンプルを実行するには、ソースコードを取得し、次のコマンドを呼び出します。
$ ./gradlew :spring-session-sample-boot-redis:bootRun
サンプルを機能させるには、ローカルホストで Redis 2.8+ をインストールします (英語) を実行し、デフォルトのポート (6379) で実行する必要があります。または、Redis サーバーを指すように RedisConnectionFactory を更新することもできます。もう 1 つのオプションは、Docker (英語) を使用してローカルホストで Redis を実行することです。詳細な手順については、Docker Redis リポジトリ (英語) を参照してください。 |
これで、localhost:8080/ でアプリケーションにアクセスできるようになります。
security
サンプルアプリケーションの探索
これで、アプリケーションを使用してみることができます。次のように入力してログインします。
ユーザー名 user
パスワード password
次に、"ログイン " ボタンをクリックします。前に入力したユーザーでログインしていることを示すメッセージが表示されます。ユーザーの情報は、Tomcat の HttpSession
実装ではなく Redis に保存されます。
それはどのように機能しますか?
Tomcat の HttpSession
を使用する代わりに、Redis で値を保持します。Spring Session は、HttpSession
を Redis による実装に置き換えます。Spring Security の SecurityContextPersistenceFilter
が SecurityContext
を HttpSession
に保存すると、Redis に永続化されます。
新しい HttpSession
が作成されると、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
を SESSION
Cookie の値に置き換えてください。
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
これで、localhost:8080/ のアプリケーションにアクセスして、認証されなくなったことを確認できます。