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

相关推荐
Java陈序员5 小时前
企业级!一个基于 Java 开发的开源 AI 应用开发平台!
spring boot·agent·mcp
杨运交13 小时前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
用户3074596982071 天前
Redis 延时队列详解
redis
烤代码的吐司君1 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
Flittly2 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Flynt2 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
掉鱼的猫4 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
leeyi4 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
人活一口气4 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
云技纵横4 天前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis