tomcat session manger 的session失效问题(云问科技)

本文分析了Tomcat Session Manager在使用Memcached时可能出现的Session失效问题,原因是默认配置采用粘性Session。提出了两种解决方法:1) 基于给定策略的路由,启用并配置jvmRoute确保同一jsessionid访问同一台Tomcat;2) 放弃粘性Session,每次从Memcached加载最新Session。并提供了完整的配置文件示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 客户端A访问A机器, A机器本地随机产生jsessionid - 目标memcache节点的别名, 如
D206172B7786671E0A6EB71D1F65F15F-n1

2. 此时session实例化, 存入membercached, key为D206172B7786671E0A6EB71D1F65F15F-n1
              

3. 此时客户端A访问B机器, 此时出现两种情况
Q1. 客户端A之前有cookie, 且存在jsessionid, 分两种情况
1. B机器存在该jsessionid对应的session缓存, 直接返回内存中的session
2. B机器没有该jsessionid对应的session缓存, 或已失效, 向memcache获取, 可正确获取, 由sessionManager实现类具体实现的map存储, 同步反编译源码可知
                                
Q2. 客户端A没有cookie
B机器写入jsessionid D206172B7786671E0A6EB71D1F65F15F-n1到客户端A, 回到Q1情况

4. 问题原因, tomcat session manger接口默认为粘性session配置
安装在Tomcat上的MSM使用本机内存保存session,和StandardManager一样。
另外,当一个请求结束时,session会被送回Memcached进行备份。
当下一次请求开始时,tomcat本地Session可用,直接服务,请求结束后,session又被送回Memcached备份, 这就是导致问题的原因

1. 解决方式1
基于给定策略的路由, 实现同一个jsessionid一定是访问同一台tomcat, 那么粘性session的配置会正确处理session的转移
启用粘性session后, 必须指定jvmroute参数来对请求做路由
<Engine defaultHost="localhost" name="Catalina" jvmRoute="tomcat71">
执行流程
1. 客户端A访问机器A, 得到jsessionid假设为 xx-n1:tomcat1
2. 客户端A访问机器B, 带回的jsessionid为 xx-n1:tomcat1, 与机器B的route不同, 此时机器B从memcache加载session, 并重写sessionid为 xx-n1:tomcat2
3. 此时客户端A重新访问A, 带回的jsessionid为 sessionid为 xx-n1:tomcat2, 回到2逻辑
                                      

2. 解决方式2
放弃粘性session, sticky="false"
非粘性session将每次从memcache中根据key load最新的session
                           

5. 完整的配置文件
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes= "n1:114.55.66.121:12000"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sticky="false"
sessionBackupTimeout="500"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
copyCollectionsForSerialization="true" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值