You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3迁移后Session事件不触发及Redis索引缺失求助

解决方案

1. 删除自定义的RedisIndexedSessionRepository Bean

移除你在UssmConfig中定义的以下代码(包括@Primary注解):

@Bean
@Primary
public RedisIndexedSessionRepository redisIndexedSessionRepository(RedisTemplate<String, Object> redisTemplate) {
    return new RedisIndexedSessionRepository(redisTemplate);
}

Spring Boot 3 搭配 Spring Session 3.x 会自动通过RedisHttpSessionConfiguration创建RedisIndexedSessionRepository Bean(名为sessionRepository),手动定义会覆盖自动配置的核心逻辑,导致事件监听、索引维护等功能失效。

2. 确认依赖配置正确

确保项目引入了完整的Redis会话依赖:

Maven 配置

<dependencies>
    <!-- Spring Boot Redis Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- Spring Session Redis -->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
</dependencies>

Gradle 配置

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis'
}

3. 检查Spring Session配置

在application.yml或application.properties中确认Redis会话配置正确:

application.yml

spring:
  session:
    store-type: redis # 指定用Redis存储会话
    redis:
      namespace: spring:session # 自定义Redis命名空间
      flush-mode: on_save # 会话刷新模式
      cleanup-cron: 0 * * * * ? # 过期会话清理定时任务(默认已配置)

application.properties

spring.session.store-type=redis
spring.session.redis.namespace=spring:session
spring.session.redis.flush-mode=on_save
spring.session.redis.cleanup-cron=0 * * * * ?

4. 排查自动配置阻断情况

如果之前出现Consider defining a bean...错误,检查是否存在以下情况:

  • 项目是否通过@SpringBootApplication(exclude = RedisHttpSessionConfiguration.class)排除了Spring Session自动配置,若有则移除该排除项。
  • 是否自定义了RedisTemplate但泛型不匹配?RedisHttpSessionConfiguration需要注入RedisTemplate<String, Object>,如果自定义了模板,确保泛型符合要求,或通过@Qualifier指定正确的Bean。

5. 验证功能恢复

启动应用后执行以下验证:

  • 登录创建会话,检查Redis中是否生成{namespace}:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME索引键。
  • 等待会话过期(或手动删除Redis会话键),通过事件监听器验证SessionExpiredEvent和SessionDeletedEvent是否触发:
@Component
public class SessionEventListener {

    @EventListener
    public void onSessionExpired(SessionExpiredEvent event) {
        System.out.println("会话过期:" + event.getSessionId());
    }

    @EventListener
    public void onSessionDeleted(SessionDeletedEvent event) {
        System.out.println("会话删除:" + event.getSessionId());
    }
}

内容的提问来源于stack exchange,提问作者Subin Chalil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:35:20