中信国际inMotion项目Session id重复问题总结
中信国际inMotion项目Session id重复问题总结
-
Tomcat默认开启了
Request对象的复用,回收时先清理attribute再清理header -
Spring session的会话管理机制分为3个步骤
- 从
request的attribute中获取session对象,获取到则使用。 - 从请求中(如请求头)获取sessionid,再从如redis等会话仓库中获取session,暂存到request的attribute中然后返回。
- 创建新的session,暂存到request的attribute中然后返回。
- 从
-
正常情况下,请求结束后tomcat会回收
request对象,不会出现问题。 -
本次原因在于
request对象在应用层的代码使用上出现了意外的泄露,主交易线程结束后,request对象仍被使用,在一定的时间间隙时,会导致2.b的机制被重新触发,致使session对象被遗留在request对象中,后续复用出现问题。- 应用层在
controller层通过异步线程池的方式调用了另一个controller的业务方法。 - 该异步线程池使用了
decorator机制将RequestContextHolder上下文复制到了异步线程,导致异步线程能获取到主交易线程的request。 - 主交易线程提交了异步任务后不等待异步任务完成就结束了当前交易,导致tomcat对
request对象进行了回收 - 应用层通过
aop方式对每个controller进行了切面拦截,拦截代码中使用了类似:request.getSession()方法获取会话。 - 如果在tomcat回收了
attribute后,还没有回收header之前,触发了getSession调用,就会出现session泄露问题。
- 应用层在