使用MongoDB作为Spring Session的存储
春季会话支持将Redis用作存储,但现阶段不支持其他数据库。因此,我们创建了一个扩展来将MongoDB用作存储。
春季会议是什么?
简单来说,你可以通过使用过滤器(springSessionRepositoryFilter)来实现对Servlet容器的Session处理进行拦截,从而实现不依赖于Servlet容器的Session集群化。具体的机制细节请参考”How HttpSession Integration Works”。
尽管关于日语的信息很少,但可以参考一下使用Spring-Session。
用法
这个仓库在这里。
使用方法在 USAGE.ja 文件中有写,只要看那个应该就能明白。
总的来说,你要做的事情有以下三件。
- 在pom.xml或build.gradle中添加依赖项。
编写用于MongoDB连接设置的Java配置。
如果使用XML进行配置,则需要添加Spring的bean配置(XML),并在web.xml中设置过滤器。
关于实施
我认为有时候也会想要使用除了MongoDB之外的数据库(如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中的命名保持一致。