当前位置: 首页 > article >正文

分布式会话管理实战:Session共享与状态管理的完整方案

分布式会话管理实战Session共享与状态管理的完整方案大家好我是迪哥。分布式系统中会话管理是一个经典问题。从传统的 Session 复制到 Redis 共享从 JWT Token 到 OAuth2我们经历了多种方案的演进。今天就聊聊分布式会话管理的最佳实践。会话管理方案对比方案优点缺点适用场景Session 复制简单同步开销大扩展性差小集群粘性会话性能好单点故障问题中等规模Redis 共享高可用易扩展需要额外依赖推荐JWT Token无状态易扩展Token 过期处理复杂API 网关OAuth2标准协议实现复杂多系统集成Redis Session 共享Spring Session 配置Configuration EnableRedisHttpSession(maxInactiveIntervalInSeconds 1800) public class RedisSessionConfig { Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(localhost, 6379); } }自定义 Session 操作Service public class SessionService { Autowired private RedisTemplateString, Object redisTemplate; private static final String SESSION_PREFIX session:; public void setAttribute(String sessionId, String key, Object value) { redisTemplate.opsForHash().put(SESSION_PREFIX sessionId, key, value); redisTemplate.expire(SESSION_PREFIX sessionId, 30, TimeUnit.MINUTES); } public Object getAttribute(String sessionId, String key) { return redisTemplate.opsForHash().get(SESSION_PREFIX sessionId, key); } public void invalidate(String sessionId) { redisTemplate.delete(SESSION_PREFIX sessionId); } }JWT Token 方案Token 生成与验证Service public class JwtService { private static final String SECRET_KEY your-256-bit-secret; private static final long EXPIRATION_TIME 86400000; // 24小时 public String generateToken(UserDetails userDetails) { MapString, Object claims new HashMap(); return Jwts.builder() .setClaims(claims) .setSubject(userDetails.getUsername()) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public boolean validateToken(String token, UserDetails userDetails) { final String username extractUsername(token); return (username.equals(userDetails.getUsername()) !isTokenExpired(token)); } }Token 刷新机制Service public class TokenRefreshService { Autowired private RedisTemplateString, String redisTemplate; private static final String REFRESH_TOKEN_PREFIX refresh:; public void storeRefreshToken(String username, String refreshToken) { redisTemplate.opsForValue().set(REFRESH_TOKEN_PREFIX username, refreshToken, 7, TimeUnit.DAYS); } public boolean validateRefreshToken(String username, String refreshToken) { String storedToken redisTemplate.opsForValue().get(REFRESH_TOKEN_PREFIX username); return refreshToken.equals(storedToken); } public void removeRefreshToken(String username) { redisTemplate.delete(REFRESH_TOKEN_PREFIX username); } }OAuth2 集成Spring Security OAuth2 配置Configuration EnableAuthorizationServer public class OAuth2Config extends AuthorizationServerConfigurerAdapter { Autowired private AuthenticationManager authenticationManager; Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient(client-id) .secret(client-secret) .authorizedGrantTypes(password, refresh_token) .scopes(read, write) .accessTokenValiditySeconds(3600) .refreshTokenValiditySeconds(86400); } Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints.authenticationManager(authenticationManager); } }会话安全防止 Session 固定攻击Service public class SessionFixationProtectionFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpSession session request.getSession(false); if (session ! null !isNewSession(session)) { String currentUser (String) session.getAttribute(user); if (currentUser ! null) { // 登录成功后重新生成 Session ID session.invalidate(); request.getSession(true); } } filterChain.doFilter(request, response); } }会话超时处理Configuration public class SessionTimeoutConfig { Bean public FilterRegistrationBeanSessionTimeoutFilter sessionTimeoutFilter() { FilterRegistrationBeanSessionTimeoutFilter registration new FilterRegistrationBean(); registration.setFilter(new SessionTimeoutFilter()); registration.addUrlPatterns(/*); return registration; } } public class SessionTimeoutFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletRequest req (HttpServletRequest) request; HttpSession session req.getSession(false); if (session ! null session.isNew()) { session.setMaxInactiveInterval(1800); // 30分钟 } chain.doFilter(request, response); } }最佳实践清单维度最佳实践会话存储使用 Redis 共享避免 Session 复制Token 方案短时间 access token 长时间 refresh token安全启用 HTTPS防止会话劫持超时设置合理的超时时间定期清理过期会话监控监控会话数量、活跃用户数、超时率说到会话管理我家那只叫 Docker 的哈士奇最近学会了会话保持——只要我摸过它一次它就会跟着我一整天这粘性会话比我们的 Nginx 还强 我是迪哥我们下期再见

相关文章:

分布式会话管理实战:Session共享与状态管理的完整方案

分布式会话管理实战:Session共享与状态管理的完整方案 大家好,我是迪哥。分布式系统中,会话管理是一个经典问题。从传统的 Session 复制到 Redis 共享,从 JWT Token 到 OAuth2,我们经历了多种方案的演进。今天就聊聊分…...

NoFences:完全免费的桌面分区神器,3分钟告别Windows桌面混乱

NoFences:完全免费的桌面分区神器,3分钟告别Windows桌面混乱 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了Windows桌面上杂乱无章的图标…...

一篇看懂 SimGen:它为什么能“同时生成手术图像和分割掩码”?

在医学影像领域,“生成图像”已经不算新鲜事;但在手术场景里,真正有价值的并不只是生成一张“看起来像真的”图,而是同时生成一张能够精确标出器械、组织和解剖区域的分割掩码。因为对手术 AI 来说,最贵的从来不是图片…...

ReMe:为AI智能体构建长期记忆与上下文管理的开源框架

1. 项目概述与核心价值如果你正在构建或使用AI智能体(Agent),并且被“金鱼记忆”问题困扰——比如对话一长,模型就忘了开头说了什么;或者每次新会话都像初次见面,完全记不住用户偏好和历史任务——那么ReMe…...

魔兽争霸3终极增强插件:5分钟快速解决游戏兼容性问题

魔兽争霸3终极增强插件:5分钟快速解决游戏兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽争霸3设…...

Halcon局部阈值分割避坑指南:dyn_threshold与var_threshold到底怎么选?

Halcon局部阈值分割避坑指南:dyn_threshold与var_threshold到底怎么选? 在工业视觉检测中,遇到反光金属表面的划痕识别或明暗不均背景下的轮廓定位时,全局阈值分割往往力不从心。Halcon提供的dyn_threshold和var_threshold两个局部…...

自动驾驶汽车保险七大议题:从技术视角看责任转移与系统设计

1. 自动驾驶汽车保险的七个核心议题:从工程师视角看技术与责任的碰撞作为一名在汽车电子和嵌入式系统领域摸爬滚打了十几年的工程师,我亲眼见证了从ABS到自适应巡航,再到今天各种L2辅助驾驶的演进。每当和圈内朋友聊起全自动驾驶,…...

从零构建企业级API客户端:设计模式、类型安全与工程实践

1. 项目概述与核心价值最近在对接一个名为“Seedance2”的第三方API服务时,我遇到了一个不大不小的麻烦。这个服务本身功能强大,提供了从数据同步、事件处理到复杂业务逻辑编排等一系列能力,但它的官方SDK要么文档语焉不详,要么在…...

马斯克当庭翻脸:刚说完“比特币好“,转身狂喷“其他加密货币都是骗局“

一句法庭证词,炸翻整个币圈2026年4月29日,美国奥克兰法院。埃隆马斯克坐在证人席上,面对一屋子律师和记者,正在为他起诉OpenAI的案件作证。当被问及OpenAI在2018年是否有计划通过首次代币发行(ICO)筹集资金…...

Piccolo-FIM:DRAM细粒度访问优化技术解析

1. 现代DRAM架构的细粒度访问挑战在传统DRAM架构中,数据访问的最小单位通常是一个完整的行(Row),这种粗粒度的访问机制在处理图计算等不规则访问模式时暴露出了明显的效率问题。当需要随机访问内存中的离散数据时,系统…...

JDspyder终极指南:如何用Python自动化脚本实现京东茅台抢购

JDspyder终极指南:如何用Python自动化脚本实现京东茅台抢购 【免费下载链接】JDspyder 京东预约&抢购脚本,可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 在电商促销和限量商品抢购的激烈竞争中,手动…...

GPU加速的时序驱动布局优化方法解析

1. 时序驱动布局优化:GPU加速的关键路径分析方法在超大规模集成电路(VLSI)物理设计流程中,布局阶段的质量直接影响芯片的时序收敛和最终性能。传统布局算法主要关注线长和拥塞优化,对时序指标的考虑相对间接。随着工艺节点不断进步&#xff0…...

MySQL 比较规则(Collation)详解

一、概述 比较规则(Collation) 是一组定义如何比较和排序字符集中字符的规则。它决定了: 字符串的大小写是否敏感(A a?)重音符号是否敏感( e?)多语言字符的排序顺序&…...

月薪8K到年薪80万!这个AI职位一年暴涨985%,普通人如何抓住风口?2026年最火爆的5个岗位+3条入场路径全解析!

文章讲述了AI Agent开发工程师的兴起,年薪可达80万。文章以小李的真实故事为例,展示了通过主动学习AI技术,可以实现职业的巨大转变。文章还分析了Agentic AI的特点及其对就业市场的影响,指出40%的岗位将被重新定义。文章列举了AI …...

基于RK3568与CODESYS的工业边缘控制器:软PLC如何重塑自动化设备核心

1. 为什么工业自动化需要软PLC? 记得五年前我第一次接触传统PLC时,被它的价格吓了一跳。一台西门子S7-1200基础型号就要上万元,加上各种扩展模块轻松突破两万。更让我头疼的是,每次设备升级都要重新采购硬件,旧设备只能…...

终极Flash浏览器指南:如何在现代浏览器中畅玩经典Flash游戏

终极Flash浏览器指南:如何在现代浏览器中畅玩经典Flash游戏 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还在为无法玩到童年记忆中的Flash游戏而烦恼?当主…...

冠珠瓷砖×莫氏鸡煲×叠滘东胜东队,德叔有请,莫叔掌勺,“力撑”叠滘龙船传承

5月10日,2026叠滘龙船漂移大赛金牌合作伙伴冠珠瓷砖品牌代表、新明珠集团董事长叶德林“德叔”有请,莫氏鸡煲创始人“莫叔”掌勺,携火爆全网的莫氏祛湿鸡煲、紫洞黄皮酒,探班叠滘东胜东队训练场。当天下午,德叔、莫叔还…...

特征工程:从数据到特征

特征工程:从数据到特征 1. 技术分析 1.1 特征工程流程 特征工程是机器学习的核心环节: 特征工程流程数据理解 → 特征提取 → 特征选择 → 特征转换 → 特征验证1.2 特征类型 类型描述处理方法数值型连续数值归一化、标准化分类型类别标签独热编码、…...

强化学习在推测执行漏洞挖掘中的应用与实践

1. 推测执行漏洞与安全挑战现代处理器中的推测执行技术通过预测分支路径提前执行指令,大幅提升了指令级并行性。当处理器遇到条件分支时,它会根据历史记录预测分支走向,并提前执行预测路径上的指令。如果预测正确,可以节省约10-15…...

计网实验一

课程实验报告专 业:物联网工程 班 级:2303学 号:231040700302 姓 名:杜子健实验名称:实验一实验类型:实验实验日期:2025年11月12日一 实…...

WSA Toolbox:Windows 11上5分钟搭建Android应用生态的终极指南

WSA Toolbox:Windows 11上5分钟搭建Android应用生态的终极指南 【免费下载链接】wsa-toolbox A Windows 11 application to easily install and use the Windows Subsystem For Android™ package on your computer. 项目地址: https://gitcode.com/gh_mirrors/ws…...

XUnity.AutoTranslator完整指南:让外语游戏瞬间变中文的免费神器

XUnity.AutoTranslator完整指南:让外语游戏瞬间变中文的免费神器 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为语言障碍而无法畅玩海外Unity游戏吗?XUnity.AutoTranslator…...

AGENTS.md:为AI编码助手定制的项目说明书,提升人机协作效率

1. 项目概述:为什么你的项目需要一个“AI专属说明书”?如果你最近在尝试用GitHub Copilot、Cursor或者Claude Code来辅助开发,大概率遇到过这样的场景:你满怀期待地给AI下达一个指令,比如“帮我给这个React组件添加一个…...

离散化离散化差分

数组开不了1e9&#xff0c;但是好在坐标点会很分散&#xff0c;那么相当于将点“挤到”1-n的位置&#xff0c;一个位置映射了一个坐标点&#xff0c;排序后&#xff0c;坐标的相对位置并不发生改变&#xff0c;离散化由此得来。#include<bits/stdc.h> #define int long l…...

开源项目发布自动化:GitHub与ClawHub技能包一键发布工具详解

1. 项目概述与核心价值如果你和我一样&#xff0c;经常需要将本地开发的项目&#xff0c;尤其是那些为ClawHub平台准备的技能包&#xff0c;发布到GitHub并同步推送到ClawHub技能市场&#xff0c;那你一定对下面这个场景不陌生&#xff1a;每次发布前&#xff0c;都要在脑子里重…...

5个高效处理PDF的Windows命令行工具:Poppler完整解决方案

5个高效处理PDF的Windows命令行工具&#xff1a;Poppler完整解决方案 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 在Windows平台上处理PDF文档时…...

Display Driver Uninstaller:Windows显卡驱动终极清理方案

Display Driver Uninstaller&#xff1a;Windows显卡驱动终极清理方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstal…...

基于Remix与React构建隐私优先的订阅费用追踪器Subs

1. 项目概述&#xff1a;一个纯粹、高效的订阅费用追踪器在数字订阅服务泛滥的今天&#xff0c;你是否也常常感到困惑&#xff1a;每个月到底有多少笔自动扣款&#xff1f;Netflix、Spotify、各种云服务、会员费……这些零散的费用加起来&#xff0c;一年可能是一笔不小的开销。…...

专业指南:高效在ARM设备上运行x86_64程序的完整解决方案

专业指南&#xff1a;高效在ARM设备上运行x86_64程序的完整解决方案 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 你是否正…...

QMCDecode:让QQ音乐加密文件重获自由的Mac专属工具

QMCDecode&#xff1a;让QQ音乐加密文件重获自由的Mac专属工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换…...