在分布式系统架构中,用户请求可能被负载均衡器分发到不同的服务器节点。如果用户的第一次请求落在服务器A并创建了Session,而第二次请求被路由到服务器B,服务器B无法识别该用户的Ses
在分布式系统架构中,用户请求可能被负载均衡器分发到不同的服务器节点。如果用户的第一次请求落在服务器A并创建了Session,而第二次请求被路由到服务器B,服务器B无法识别该用户的Session状态,导致用户需要重新登录,这显然是灾难性的用户体验。 三种解决方案粘性会话(Sticky Sessions)例如在Nginx的负载均衡策略中,通过IP哈希等策略将同一个ip的用户请求固定到同一服务器中,这样session自然也没有失效。 缺点:单点故障风险高(服务器宕机导致Session丢失);扩容时Rehash引发路由混乱。 Session复制例如在Tomcat集群中实现Session复制,需通过修改配置文件使不同节点间自动同步会话数据。集群内所有服务器实时同步Session数据。 缺点:同步开销随服务器数量指数级增长,引发网络风暴和内存浪费。 redis统一存储SpringBoot整合Spring Session,通过redis存储方式实现session共享。 通过集中存储Session(如Redis),实现:
Spring Session + Redis集成添加依赖在pom.xml中引入关键依赖:
配置Redis连接在application.properties中加上Redis的配置:
redis配置类需要注入一个名为springSessionDefaultRedisSerializer的序列化对象,用于在redis中写入对象时进行序列化,不然session中存入对象会抛出异常。
不需要显示的通过注解@EnableRedisHttpSession来开启session共享。 使用Session
session共享验证调用登录接口:
可以看到返回的响应头中带有cookie,后续请求需要带上这个cookie去请求接口才能识别出用户。 查询用户信息:
可以修改端口再启动一个服务,换个服务查询用户信息:
高级配置自定义Cookie配置(支持跨域)
Spring Session核心原理SessionAutoConfiguration这就是为什么不需要使用注解@EnableRedisHttpSession来开启session共享。 SessionAutoConfiguration类中会引入RedisSessionConfiguration。
RedisSessionConfiguration类中会引入RedisHttpSessionConfiguration:
而注解@EnableRedisHttpSession引入的配置类也是RedisSessionConfiguration:
SessionRepositoryFilter自定义过滤器SessionRepositoryFilter拦截所有请求,透明地替换了Servlet容器原生的HttpSession实现。 将请求包装为SessionRepositoryRequestWrapper:
HttpServletRequestWrapperHttpServletRequestWrapper中重写getSession()方法实现session会话替换。
RedisSessionRepositoryRedisSessionRepository负责创建RedisSession。
RedisSessionsession保存时使用的是sessionRedisOperations,其实就是RedisTemplate,这个RedisTemplate是spring session自己创建的,而不是使用的项目中的。
|
2021-04-08
2021-10-03
2024-09-30
2021-07-26
2019-10-11