Spring Session はセッションのストレージとして Redis をサポートしていますが、他の DB は現時点ではサポートされていません。そこで、MongoDB をストレージとして使うための拡張を作成してみました。
Spring Session とは
簡単に言えば、サーブレットコンテナに依存しないセッションのクラスタリングなんかができるようになります。フィルタ(springSessionRepositoryFilter)を使用して、サーブレットコンテナの Session 処理を横取りするような実装になっています (仕組みの詳細は How HttpSession Integration Works を参照)
日本語の情報が少ないのですが、Spring-Sessionを使ってみた あたりが参考になります。
使い方
リポジトリはこちらにあります。
使い方は USAGE.ja に書いてあるので、そちらを見ればわかると思います。
基本的に、やることは以下の3つです。
- pom.xml や build.gradle に dependency を追加する。
- MongoDB 接続設定用の Java Config を書く。
- XMLで設定する場合は、Spring の bean 設定(XML)を追加して、web.xml にフィルタの設定をする。
実装について
MongoDB 以外の DB (MySQL とか)を使いたい、ということもあると思うので、実装の詳細について解説します。
やらないといけないことは以下の通りです。
ExpiringSession を継承してセッションクラスを作る。
これがデータベースに保存されるべきエンティティになります。
spring-session-mongodb では MongoSession クラスが該当します。
SessionRepository を実装したリポジトリクラスを作る。
いわゆる DAO。実際にデータベースにセッションクラスを読み書きするための実装です。
spring-session-mongodb では MongoSessionRepository が該当します。これは Spring Data MongoDB を使用してデータベースを読み書きするようになっています。
実装上注意すべき点がいくつかあります。
- getSession() をしたときに必ず lastAccessedTime を更新しないといけません。
- セッション属性は型が不定 (Object型)なので、シリアライズ・デシリアライズ処理を自前で書かなければなりません。
- 古くなったセッションを自動破棄する処理はないので、自前で実装する必要があります。flushExpiredSessions() に実装しているので、参考にしてください。
sessionRepositoryFilter を生成するための Configuration クラスを作成する。
spring-session-mongodb では MongoSessionConfiguration が該当します。
@Bean アノテーションをつけるメソッド名は springSessionRepositoryFilter にします。変えてもいいですが、当然 web.xml に記述する名前をあわせる必要があります。