1 什么是Session
Session代表着服务器和客户端一次会话的过程,Session对象存储着特定用户会话所需的属性及配置信息,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量不会丢失,而是在整个用户会话中一直存在下去,当客户端关闭会话,或者Session超时失效时会话结束。
2 分布式Session
在分布式场景下,一个用户的Session如果只存储在一台服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上时,该服务器上没有用户的Session,就可能导致用户需要进行重新登录等操作。
分布式场景下Session也需要进行分布式处理,而Session分布式处理有三种方式:
(1) 粘性Session;
(2) 应用服务器间的Session复制共享;
(3) 基于缓存的Session共享;
2.1 粘性Session
即将用户的所有请求都路由到一个服务器节点上,用户的Session也放在这台服务器节点上。
粘性Session需要负载均衡器的配合。
粘性Session要求用户的所有请求都由一个服务器节点承接,因此其缺陷也比较明显:如果用户对应的服务器节点宕机异常,那么用户的Session将丢失。
2.2 应用服务间的Session复制共享
每个用户的Session被创建后,就将其复制到所有节点的内存中,这样用户访问每一台服务器,都有其对应的Session。
同样存在一些问题:
(1) 应用程序需要对Session进行管理、复制;
(2) 内存重复占用;
2.3 基于缓存的Session共享
使用一个单独的存储服务器存储Session数据,这个存储服务器被所有应用服务共享,例如Redis缓存。
基于缓存的Session共享要求实现HttpSessionWrapper用来存取Session。
HttpSessionWrapper有很多实现方案,例如配合JWT Token使用、使用Tomcat的RedisSessionManager或者使用spring-session-data-redis。