Spring Session - Spring Boot
このガイドでは、Spring Boot を使用するときに、Spring Session を使用してリレーショナルデータベースを透過的に活用し、Web アプリケーションの HttpSession
をバックアップする方法について説明します。
完成したガイドは、httpsession-jdbc-boot サンプルアプリケーションにあります。 |
依存関係の更新
Spring Session を使用する前に、依存関係を更新する必要があります。動作している Spring Boot Web アプリケーションを使用していることを前提としています。Maven を使用する場合は、次の依存関係を追加する必要があります。
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
</dependencies>
Spring Boot は、Spring Session モジュールの依存関係管理を提供するため、依存関係のバージョンを明示的に宣言する必要はありません。
Spring Boot の設定
必要な依存関係を追加した後、Spring Boot 構成を作成できます。ファーストクラスの自動構成サポートのおかげで、依存関係を追加するだけで、Spring Boot がリレーショナルデータベースに基づいた Spring Session をセットアップします。
単一の Spring Session モジュールがクラスパスに存在する場合、Spring Boot はそのストア実装を自動的に使用します。複数の実装がある場合は、上記のように、セッションの保存に使用する StoreType を選択する必要があります。
内部的には、Spring Boot は、@EnableJdbcHttpSession
アノテーションを手動で追加するのと同等の構成を適用します。これにより、springSessionRepositoryFilter
という名前の Spring Bean が作成されます。その Bean は Filter
を実装しています。このフィルターは、Spring Session によってサポートされる HttpSession
実装の置き換えを担当します。
application.properties
を使用してさらにカスタマイズできます。次のリストは、その方法を示しています。
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds are used. spring.session.jdbc.initialize-schema=embedded # Database schema initialization mode. spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema. spring.session.jdbc.table-name=SPRING_SESSION # Name of the database table used to store sessions.
詳細については、Spring Boot ドキュメントの Spring Session (英語) の部分を参照してください。
DataSource
の構成
Spring Boot は、Spring Session を H2 データベースの組み込みインスタンスに接続する DataSource
を自動的に作成します。本番環境では、リレーショナルデータベースを指すように構成を更新する必要があります。例: application.properties に以下を含めることができます。
spring.datasource.url= # JDBC URL of the database. spring.datasource.username= # Login username of the database. spring.datasource.password= # Login password of the database.
詳細については、Spring Boot ドキュメントの DataSource を構成する (英語) 部分を参照してください。
サーブレットコンテナーの初期化
Spring Boot の設定は、Filter
を実装する springSessionRepositoryFilter
という名前の Spring Bean を作成しました。springSessionRepositoryFilter
Bean は、HttpSession
を Spring Session によるカスタム実装に置き換えるロールを果たします。
Filter
がその魔法を実行するために、Spring は Config
クラスをロードする必要があります。最後に、サーブレットコンテナー(つまり、Tomcat)がすべてのリクエストに springSessionRepositoryFilter
を使用するようにする必要があります。幸い、Spring Boot がこれらの両方の手順を実行してくれます。
httpsession-jdbc-boot
サンプルアプリケーション
httpsession-jdbc-boot サンプルアプリケーションは、Spring Boot を使用するときに、Spring Session を使用して H2 データベースを透過的に活用し、Web アプリケーションの HttpSession
をバックアップする方法を示しています。
httpsession-jdbc-boot
サンプルアプリケーションの実行
サンプルを実行するには、ソースコードを取得し、次のコマンドを呼び出します。
$ ./gradlew :spring-session-sample-boot-jdbc:bootRun
これで、localhost:8080/ でアプリケーションにアクセスできるようになります。
セキュリティサンプルアプリケーションの調査
これで、アプリケーションを使用してみることができます。これを行うには、以下を入力してログインします。
ユーザー名 user
パスワード password
次に、ログインボタンをクリックします。以前に入力したユーザーでログインしていることを示すメッセージが表示されます。ユーザーの情報は、Tomcat の HttpSession
実装ではなく、H2 データベースに保存されます。
それはどのように機能しますか?
Tomcat の HttpSession
を使用する代わりに、H2 データベースに値を保持します。Spring Session は、HttpSession
を、リレーショナルデータベースによる実装に置き換えます。Spring Security の SecurityContextPersistenceFilter
が SecurityContext
を HttpSession
に保存すると、H2 データベースに永続化されます。
新しい HttpSession
が作成されると、Spring Session はブラウザーに SESSION
という名前の Cookie を作成します。その Cookie には、セッションの ID が含まれています。Cookie を表示できます(Chrome (英語) または Firefox [Mozilla] (英語) を使用)。
セッションは、localhost:8080/h2-console/(JDBC URL に jdbc:h2:mem:testdb
を使用)で入手可能な H2Web コンソールを使用して削除できます。
これで、localhost:8080/ のアプリケーションにアクセスして、認証されなくなったことを確認できます。