Session 共享不是加个 Redis 就行:一次登录态串号事故,和 4 种方案的真实取舍
title: Session 共享不是加个 Redis 就行一次登录态串号事故和 4 种方案的真实取舍tags: Session, Redis, 分布式, Spring Session, JWTdescription: 从一次用户 A 看到用户 B 数据的串号事故出发拆解 Session 复制、Cookie、集中存储、JWT 四种共享方案的适用边界以及 Spring Session 落地的真实坑。去年我们线上出过一个特别诡异的工单用户投诉我明明登录的是自己的账号刷新一下却变成了别人的名字。一开始我们以为是前端 bug查了三天才定位到——是 Session 共享那一层出了岔子。这篇文章把四种 Session 共享方案拆开讲重点是我不希望你踩的那几个坑。先给不熟悉的兄弟补一句背景传统的HttpSession默认存在应用服务器本地内存里。单体时代没问题但一旦上了负载均衡、应用起了多个实例用户第一次请求打到机器 A 登录第二次请求被轮询到机器 BB 上根本没有这个 Session于是又让你重新登录甚至更糟——读到 B 上残留的别人 Session。方案一Session 复制tomcat cluster早期最粗暴的做法让多个 Tomcat 互相广播 Session。配置一下Cluster节点就能用。!-- tomcat server.xml 里开启 DeltaManager 做 Session 复制 -- Cluster classNameorg.apache.catalina.ha.tcp.SimpleTcpCluster Manager classNameorg.apache.catalina.ha.session.DeltaManager expireSessionsOnShutdownfalse notifyListenersOnReplicationtrue/ !-- 复制的其实是序列化后的 Session 对象节点越多网络广播量越大 -- /Cluster逐行看DeltaManager只同步增量变更比全量广播好一点但本质还是把每个 Session 序列化后在节点间互发。我们的教训是当节点数超过 4 个、Session 里又塞了胖对象广播流量直接把内网带宽吃满。我不建议新项目用这个方案它和加机器是反向的——机器越多越慢而且 Session 里对象稍有不可序列化就直接报错。方案二客户端 Cookie 存状态把状态加密后直接写进 Cookie服务端无状态。好处是天然支持横向扩展坏处是体积受限Cookie 一般 4KB 上限且每次请求都带在头上。// 把少量登录信息签名后写 Cookie public void writeSessionCookie(HttpServletResponse resp, LoginUser user) { String payload user.getUserId() | user.getRole(); // 1. 用 HMAC 签名防止客户端篡改绝不只是 Base64 String signed payload . hmacSha256(payload, SECRET_KEY); Cookie c new Cookie(SESSION, Base64.getUrlEncoder().encodeToString(signed.getBytes())); c.setHttpOnly(true); // 2. 防 XSS 偷 Cookie c.setSecure(true); // 3. 只走 HTTPS c.setMaxAge(1800); // 4. 半小时过期和服务端逻辑对齐 resp.addCookie(c); }第 4 行的hmacSha256是重点Cookie 方案最大的雷是只编码不签名我见过有人直接 Base64 把 userId 塞进去前端把userId1001改成1002就串号了。签名 HttpOnlySecure这三件套缺一不可。这套方案适合登录态很薄的场景一旦要存一堆权限、购物车Cookie 装不下就得换。方案三集中存储Spring Session Redis这是现在最主流的方案spring-session-data-redis帮你把HttpSession透明地搬到 Redis业务代码几乎零改动。EnableRedisHttpSession(maxInactiveIntervalInSeconds 1800) Configuration public class SessionConfig { // 1. 默认用 Lettuce 连接 Redis注意连接池必须配否则高并发下拿不到连接 Bean public LettuceConnectionFactory connectionFactory() { LettucePoolingClientConfiguration pool LettucePoolingClientConfiguration.builder() .poolConfig(new GenericObjectPoolConfig() {{ setMaxTotal(200); setMaxIdle(50); setMinIdle(10); }}).build(); return new LettuceConnectionFactory(new RedisStandaloneConfiguration(redis-1, 6379), pool); } } // 业务代码完全不用改继续用原生 HttpSession GetMapping(/cart) public Cart getCart(HttpSession session) { return (Cart) session.getAttribute(cart); // 实际读写都走 Redis }EnableRedisHttpSession是魔法入口它用一个SessionRepositoryFilter拦截请求把你代码里的HttpSession偷偷替换成 Redis -backed 的实现。第 9 行那个连接池配置是我们用血换来的——Spring Session 默认的连接工厂没有池化QPS 一上来RedisConnection直接被借光线程全阻塞在等连接上表现就是接口超时飙红。串号事故Redis 超时回退到本地撞了别人的 Session那次工单的根因就在这。我们的 Redis 连接池当时设的maxTotal20某天 Redis 因为一次大 key 删除卡了 2 秒连接池被瞬间借空。Spring Session 拿不到 Redis 连接时没有报错而是静默回退到了本地 Map 存 Session这是个隐藏行为文档里写得很隐晦。后果是用户登录在 A 实例创建了本地 Session负载均衡下一跳到了 B 实例B 也有自己的本地 Session 池。更致命的是我们当时为了省内存Session 的 key 用的是JSESSIONID而本地 Map 的 key 空间和 Redis 的 key 空间没有隔离。两个实例本地都生成了同名JSESSIONID的概率为 0但问题出在另一个地方——我们的 nginx 当时配了ip_hash失效请求乱跳而本地 Session 回退后getAttribute偶尔读到的是另一个用户上次残留的本地对象。修复三件事把 Redis 连接池调大到 200 并加监控给 Session 的本地回退明确关闭不允许无 Redis 就降级给 Spring Session 配置独立的redisNamespace避免 key 冲突。从此再没串过。方案四JWT 无状态令牌JWT 把用户信息 签名打包成一个 token服务端不存任何 Session靠签名校验真伪。特别适合前后端分离、跨域、移动端。// 用 jjwt 签发与校验注意别踩过期和刷新的坑 public String issueToken(LoginUser user) { return Jwts.builder() .setSubject(user.getUserId()) .claim(role, user.getRole()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() 1800_000)) // 30 分钟 .signWith(Keys.hmacShaKeyFor(SECRET.getBytes()), SignatureAlgorithm.HS256) .compact(); } public Claims parse(String token) { // 校验签名和过期失败直接抛异常不会解析出伪造的 payload return Jwts.parserBuilder() .setSigningKey(Keys.hmacShaKeyFor(SECRET.getBytes())) .build().parseClaimsJws(token).getBody(); }JWT 最大的争议是无法主动吊销token 发出去后在过期前都有效你没法像 Redis Session 那样del掉它。我们的做法是access token 短时效15 分钟 refresh token 长时效存 Redis要踢人就删 Redis 里的 refresh token。这样既享受无状态又能控制强制下线。我的取舍判断新项目、前后端分离、要跨域/移动端直接上 JWT 短 token 方案。Session 共享的复杂度可以省掉。老 Spring MVC 项目、不想改业务代码Spring Session Redis但连接池和命名空间这两件事必须当天配好否则迟早出串号或超时。Session 里别塞胖对象我们把整个Authentication对象含权限树塞进 Redis一个 key 20KB千万级 Session 直接把 Redis 内存打爆。改成只存 userId权限按需查体积降到 200 字节。Cookie 方案只适合极薄登录态别拿它当通用 Session 用。Session 这层看着简单真出事就是 P0 级的用户数据泄露。我不建议为了简单就上 Session 复制也不建议为了时髦就无脑 JWT 却不处理吊销。选型先问自己三个问题要不要主动踢人登录态有多胖要不要跨域答案清晰了方案自然就出来了。思考题如果你的 JWT 私钥泄露了你会怎么止血是立刻换 key 让所有老 token 失效误伤正常用户还是引入黑名单又回到了要存状态这两难你怎么解

相关新闻

小厂凭啥年入千万?医疗材料拉力机公司逆袭记!

小厂凭啥年入千万?医疗材料拉力机公司逆袭记!

在力学检测仪器这片看似由国际巨头主导的红海市场中,一家本土企业如何脱颖而出,实现年入千万级的增长?其背后的商业逻辑,远不止是“低价策略”,而是一场基于精准洞察、技术纵深与生态化服务的深度逆袭。特别是在对精度…

2026/8/1 19:26:35 阅读更多 →
RPA (Robotic Process Automation)

RPA (Robotic Process Automation)

RPA是如何提高人工情况下效率的,流程优化,流程重新组织组合,跨不同平台和系统流程组合,半自动化自动化。旨在极大提高工作效率。玩过游戏的应该都有用过【按键精灵】,RPA就是企业级应用的【按键精灵】,RPA不…

2026/8/1 19:26:35 阅读更多 →
AI做音效素材卖钱:7天实操手册——手把手教你用Stable Audio+商用授权避坑指南

AI做音效素材卖钱:7天实操手册——手把手教你用Stable Audio+商用授权避坑指南

更多请点击: https://kaifayun.com 第一章:AI做音效素材卖钱 AI音频生成技术正快速重塑音效创作与分发生态。过去依赖专业录音棚和版权采样库的音效生产模式,如今可通过文本提示(Prompt)驱动模型即时生成高质量、可商…

2026/8/1 19:25:35 阅读更多 →

最新新闻

批量生成AI数据大屏工具(2024合集,零代码在线批量出图)

批量生成AI数据大屏工具(2024合集,零代码在线批量出图)

最近半年,我一直在研究怎么批量搞数据大屏。因为团队接了好几个政府周报和园区监控的项目,每个项目都需要出十几张甚至几十张风格统一的大屏,如果每张都从头画,累死也完不成。网上搜了一圈,看了不少工具,也…

2026/8/1 20:09:09 阅读更多 →
blrec核心功能解析:从直播捕获到弹幕保存的完整流程

blrec核心功能解析:从直播捕获到弹幕保存的完整流程

blrec核心功能解析:从直播捕获到弹幕保存的完整流程 【免费下载链接】blrec No Longer Maintained in favor of https://github.com/oneliverec/OneLiveRec 项目地址: https://gitcode.com/gh_mirrors/bl/blrec blrec是一款功能强大的直播录制工具&#xff0…

2026/8/1 20:09:09 阅读更多 →
如何打破教育资源壁垒:从寻找者到共建者的角色转变

如何打破教育资源壁垒:从寻找者到共建者的角色转变

如何打破教育资源壁垒:从寻找者到共建者的角色转变 【免费下载链接】edu-knowlege 教育各种资料,从幼儿园到小学、中学,涵盖学而思,万维、猿辅导等多个机构,持续增加中 项目地址: https://gitcode.com/gh_mirrors/ed…

2026/8/1 20:09:09 阅读更多 →
AI 自动化工具 OpenClaw 部署实操,纯图形化安装方案(含安装包)

AI 自动化工具 OpenClaw 部署实操,纯图形化安装方案(含安装包)

OpenClaw 一键安装包|一键部署,摆脱复杂环境配置 适配系统:Windows10/11 64 位、macOS Windows 版本:v2.9.0 macOS 版本:v2.7.9 核心优势 整套流程采用可视化交互方式,无需命令行操作,不必手…

2026/8/1 20:09:09 阅读更多 →
【解决方案】TypeError [ERR_INVALID_ARG_TYPE]: The “path“ argument must be of type string.

【解决方案】TypeError [ERR_INVALID_ARG_TYPE]: The “path“ argument must be of type string.

环境 Electron TypeScript Vue 问题 打包后运行exe,报错跟踪 const defaultPath path.join(homeDir, process.env.npm_package_name!, ‘db.sqlite3’) 分析 process.env.npm_package_name 的本质 process.env.npm_package_* 系列环境变量,是 npm / pnp…

2026/8/1 20:09:09 阅读更多 →
坦克大战游戏开发实战(十八)-关卡数据设计与平衡

坦克大战游戏开发实战(十八)-关卡数据设计与平衡

坦克大战游戏开发实战(十八)-关卡数据设计与平衡 前言 关卡设计是游戏设计的核心内容之一,优秀的关卡设计能够提供合理的难度曲线,让玩家在挑战中获得成就感。本文将详细讲解关卡数据的设计与平衡,包括关卡难度设计、敌人配置、道具分布、难度…

2026/8/1 20:08:08 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/8/1 13:02:46 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/8/1 10:33:33 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →