SpringBoot + Redis 实现分布式 Session 共享(解决多实例登录状态丢失问题)

一、前言

在做电商项目时,很多同学会遇到这个问题:
1.单实例登录正常,部署多台服务器后,用户一会登录、一会未登录
2.用 Nginx 负载均衡,请求落到不同实例,Session 不共享,登录状态丢失
3.用 JWT 无状态方案,但 token 无法主动失效,退出登录要等过期

今天给你一套企业级通用的分布式 Session 共享方案,用 Redis 存储 Session,所有实例共享登录状态,解决多节点部署问题,代码直接复制就能用。

二、引入依赖

java 复制代码
<!-- Spring Session + Redis -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

<!-- Redis 客户端 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

三、Redis 配置(application.yml)

java 复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 
    database: 0
  session:
    store-type: redis
    timeout: 1800  # Session 超时时间,单位秒(30分钟)

四、开启 Redis Session(启动类加注解)

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class ShopApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopApplication.class, args);
    }
}

五、登录接口(和原来一样,不用改业务代码)

java 复制代码
@PostMapping("/login")
public Result login(String username, String password, HttpSession session) {
    // 1. 校验用户名密码
    User user = userService.getByUsername(username);
    if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
        return Result.fail("用户名或密码错误");
    }

    // 2. 登录成功,存入 Session
    session.setAttribute("userId", user.getId());
    session.setAttribute("username", user.getUsername());

    return Result.success("登录成功");
}

六、登录校验拦截器(Session 方式)

java 复制代码
@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Object userId = session.getAttribute("userId");

        if (userId == null) {
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(JSON.toJSONString(Result.fail(401, "请先登录")));
            return false;
        }
        return true;
    }
}

七、拦截器注册

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/register", "/error");
    }
}

八、效果演示

1.多台服务器部署,Session 存在 Redis 中,所有实例共享

2.用户在实例 A 登录,请求落到实例 B 也能识别登录状态

3.调用 session.invalidate() 直接清掉 Redis 中的 Session,实现主动登出

4.超时自动失效,和单机 Session 体验完全一致

九、适用场景

1.电商系统集群部署

2.前后端分离项目多实例

3.需要主动失效登录状态的场景

4.不想改业务代码,从单机平滑升级到分布式

十、优点对比

十一、总结

分布式 Session 共享是电商项目从单机走向集群的关键一步,也是面试高频考点。这套方案完全兼容传统 Session API,不用改业务代码,就能实现分布式部署,解决登录状态丢失问题,毕设和企业项目都非常加分。

互动引导

你现在的电商项目是单机部署还是准备做集群?评论区说说你的部署方式,我帮你优化成分布式架构!

有用点赞 + 收藏,关注我持续更新 SpringBoot 电商项目实战干货!

相关推荐
tsyjjOvO3 小时前
分布式事务 Seata 与链路追踪 SkyWalking 全解析
分布式·skywalking
daixin88483 小时前
cursor无法正常使用gpt5.5等模型解决方案
java·redis·cursor
小猿姐5 小时前
Redis Kubernetes Operator 实测:三个方案的真实差距
redis·容器·kubernetes
阿丰资源5 小时前
SpringBoot+Vue实战:打造企业级在线文档管理系统
vue.js·spring boot·后端
0xDevNull5 小时前
Spring Boot 自动装配:从原理到实践
java·spring boot·后端
a8a3027 小时前
Laravel9.x新特性全解析
运维·spring boot·nginx
aLTttY9 小时前
Spring Boot + Redis 实现接口防抖与限流实战指南
spring boot·redis·junit
ezreal_pan9 小时前
Kafka Docker 部署持久化避坑指南:解决重启后 Cluster ID 不匹配问题
分布式·docker·zookeeper·容器·kafka·devops
小张小张爱学习10 小时前
Kafka面试题
分布式·kafka