环境
SpringBoot 2.0.4
SpringSession 2.0.5
Session存在Redis
两个服务,分别跑在两台服务器上
都使用的Chrom浏览器,版本可能不一样
项目中都是在方法里getSession()未曾使用静态变量持有session
客户端->Apache->服务
获取Session统一使用这种方式:
Application.getSession();
Application:
public class Application{
// ...
public static HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
public static HttpSession getSession() {
return getRequest().getSession();
}
// ...
}
现象
在登录的用户中无规律的某个在线用户A突然就变成了另一个在线用户B,
用户A登录时使用PC1,用户B登录时使用PC2,
也就是说PC1上登录的用户突然从用户A变成了用户B,并且能以用户B的身份正常操作
通过后台日志发现,变化后,PC1对应的sessionId已经变成了用户B登录时的sessionId,但是requestHeader中携带的cookie值没变。
如下,sessionId和cookie中的SESSION的值不一样了(spring-session默认cookie中SESSION的值是sessionId使用Base64编码之后的,此处说的是解码后比较)
public void heartbeat(){
// ...
String sessionId = Application.getSession().getId();
String cookie = Application.getRequest().getHeader("cookie");
// ...
}
暂时处理办法
目前使用前后端结合检测到session串了之后自动T下线
ps: 如果我这边表达的看不太懂,也可以看这两篇,现象是一样的
率性的 session 乱串
session串了,该怎么解决