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 电商项目实战干货!

相关推荐
ltl1 小时前
3D 并行深度:数据 / 张量 / 流水 / 序列 / ZeRO
分布式
ltl1 小时前
Redis 紧凑编码:listpack、quicklist 与 intset
redis
FserSuN9 小时前
回顾Spark的概念与应用
大数据·分布式·spark
2601_963870189 小时前
【计算机毕业设计】基于Spring Boot的宠物领养救助平台的设计与实现
spring boot·课程设计·宠物
凤山老林11 小时前
高保真集成测试:Spring Boot 结合 Testcontainers 的工程落地
spring boot·后端·集成测试
RuoyiOffice12 小时前
SpringBoot3+Vue3 接口访问日志实战:@ApiAccessLog 慢接口、参数脱敏与 OperateLog 如何分工
spring boot·vue3·traceid·spring boot 3·访问日志·apiaccesslog·操作日志
林三的日常12 小时前
【无标题】
java·spring boot·vscode·调试·后端开发
counting money13 小时前
SpringBoot 项目创建(IDEA不全,还需要修改)
java·spring boot·spring·maven
阿部多瑞 ABU13 小时前
从0到1:用 Spring Boot 3.4 + Vue3 做一个能“智能排道次“的运动会编排系统(附核心算法)
java·spring boot·后端·算法·spring
MacroZheng13 小时前
几行代码给项目集成AI功能,Spring AI 2.0太香了!
java·人工智能·spring boot