如何在Spring Boot集群环境中创建自定义Session Repository
自定义集群环境下的非持久化Session Repository实现
针对Spring Boot集群环境下非持久化会话存储的需求,推荐基于Hazelcast分布式内存实现,它天然支持集群会话同步且默认是非持久化配置,下面是完整代码示例:
1. 添加依赖(Maven)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-hazelcast</artifactId> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> </dependency> </dependencies>
2. Hazelcast集群配置
创建Hazelcast配置类,定义集群名称、会话存储Map的非持久化规则:
import com.hazelcast.config.Config; import com.hazelcast.config.MapConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HazelcastSessionConfig { @Bean public Config hazelcastConfig() { Config config = new Config(); // 设置集群名称,确保所有集群节点使用相同名称 config.setClusterName("spring-session-cluster"); // 配置会话存储的Map,明确禁用持久化 MapConfig sessionMap = new MapConfig("spring:session:sessions"); // 设置会话过期时间(示例为30分钟) sessionMap.setTimeToLiveSeconds(1800); // 关闭持久化,确保会话仅存于内存 sessionMap.getPersistenceConfig().setEnabled(false); config.addMapConfig(sessionMap); return config; } }
3. 启用Spring Session
配置Spring Session使用Hazelcast作为存储介质:
import org.springframework.context.annotation.Configuration; import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; @Configuration @EnableSpringHttpSession public class SpringSessionConfig { // 无需额外代码,Spring会自动关联Hazelcast实例处理会话 }
验证方式
- 启动多个Spring Boot实例,通过
server.port设置不同端口(如8080、8081) - 访问第一个实例的接口写入会话数据(例如
HttpSession.setAttribute("user", "test")) - 访问第二个实例的接口读取会话数据,会发现数据已同步,实现集群会话共享
- 重启任意实例后,会话数据会丢失,符合非持久化要求
如果需要完全自定义SessionRepository实现,也可以实现org.springframework.session.SessionRepository接口,基于分布式内存组件(如Ignite、Infinispan)实现,但上述Hazelcast方案是最便捷的开箱即用选择。
内容的提问来源于stack exchange,提问作者Pramod Kumar
相关产品推荐
相关产品推荐

