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

来源:互联网 发布:数据联邦 编辑:程序博客网 时间:2024/04/27 18:58

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" />
0 0