Spring Session Hazelcast跨Tomcat多JVM并发控制启动异常咨询
依赖冲突修正
你当前引入了两个不同版本的Hazelcast依赖,会导致类加载冲突:
- 移除
com.hazelcast.hazelcast-all 4.2.2依赖,统一Hazelcast版本和Spring Session 2.6.0兼容即可,可保留com.hazelcast.hazelcast 5.0或者降级到4.2.2,不要同时存在两个版本的Hazelcast核心包。
启动报错原因
你手动实例化SpringSessionBackedSessionRegistry时,该类依赖Spring容器注入的SessionRepository和BeanFactory,手动new的实例没有经过Spring的依赖注入流程,就会抛出java.lang.IllegalStateException: BeanFactory has not been injected into @Configuration class异常。
解决方案
1. 注册Spring托管的SessionRegistry Bean
不需要手动替换默认实现,只需要在配置类中声明SessionRegistry类型的Bean,Spring会自动优先使用该Bean覆盖默认的SessionRegistryImpl:
@Configuration @EnableHazelcastHttpSession // 开启Spring Session Hazelcast自动配置 public class HazelcastSessionConfig { // 你已实现的Hazelcast实例Bean,确保多节点集群配置正确 @Bean public HazelcastInstance hazelcastInstance() { Config config = new Config(); // 自定义集群名称、网络发现、会话存储Map配置等逻辑 return Hazelcast.newHazelcastInstance(config); } // 声明跨节点支持的SessionRegistry Bean @Bean public SessionRegistry sessionRegistry(FindByIndexNameSessionRepository<?> sessionRepository) { return new SpringSessionBackedSessionRegistry<>(sessionRepository); } }
2. Security配置中直接注入使用
在Spring Security配置类中直接注入上面声明的SessionRegistry即可,不要手动实例化:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private SessionRegistry sessionRegistry; @Override protected void configure(HttpSecurity http) throws Exception { http // 其他安全规则配置 .sessionManagement() .maximumSessions(1) // 按你的业务需求配置单用户最大会话数 .sessionRegistry(sessionRegistry) // 直接使用注入的实例 .maxSessionsPreventsLogin(true); // 超过会话数时阻止新登录,可选配置 } }
常见问题说明
spring-session-hazelcast没有提供单独的注解自动替换SessionRegistry,只要你声明了自定义的SessionRegistry类型Bean,Spring Security的自动配置会自动使用该Bean替换默认实现,不需要额外配置。
配置完成后可通过断点调试或者ApplicationContext获取SessionRegistry实例,确认类型为SpringSessionBackedSessionRegistry即为配置生效。
内容的提问来源于stack exchange,提问作者ruz4life
相关产品推荐
相关产品推荐

