集群服务器下的session共享

针对企业,为了应对庞大的用户访问压力,目前大多数大型网站服务器都采用集群部署的方式;针对个人,仅一台服务器而言,也会安装多个tomcat进行错时更新,保证更新后台业务时服务不断开,即模拟了集群的运行方式。在此集群中,我们就不得不考虑一个用户鉴权的问题,即在不同服务上如何保证用户均已登录,并能获取相同的用户登录信息。

在多个tomcat集群中,Session共享是必须要有的,不然负载均衡服务器转发过来不知道之前请求在哪台,就找不到Session,导致请求失败

1.各种Session的几种解决方案

 请求精确定位:基于IP地址的Hash策略,将同一用户的请求都集中在一台服务器上,这台服务器上保存了该用户的Session信息。缺点:单点部署发生宕机时,Session丢失。
 Session复制共享:可以用Tomcat自带的插件进行Session同步,使得多台应用服务器之间自动同步Session,保持一致。如果一台发生故障,负载均衡会遍历寻找可用节点,Session也不会丢失。缺点:必须是Tomcat和Tomcat之间,Session的复制也会消耗系统 的性能,使得同步给成员时容易造成内网流量瓶颈。
 基于Cache DB缓存的Session共享:使用Redis存取Session信息,应用服务器发生故障时,当Session不在内存中时就会去Cache DB中查找(要求Redis支持持久化),找到则复制到本机,实现Session共享和高可用。

2.Spring Boot-Session的实现

经常使用的Spring Boot-Session使用的就是Cache DB缓存的Session共享原理,同自定义的JRedis一起配置可以实现目的。
Cache DB缓存的Session共享原理如图所示

在这里插入图片描述
在Spring Boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下:
在这里插入图片描述
而**@EnableRedisHttpSession**这个注解是由spring-session-data-redis提供的,所以在pom.xml文件中添加:
在这里插入图片描述
接下来,则需要在配置文件中配置redis服务器的位置了,这里使用的yml的配置形式
在这里插入图片描述
这样最简单的Spring Boot + redis实现Session共享就完成了!

3.Session一致问题

当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,会新建一个),如果客户端请求不包含session id,服务端会创建一个session并且生成一个与此session相关联的session id,这个session id将被在本次响应中返回给客户端保存。
保存这个session id的方式采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。
前后端分离的项目,使用Ajax请求一般都出现跨域的问题。跨域的时候所创建的session是不会被浏览器保存下来的。所以每次进行跨域请求时,服务器都认为不是同一个浏览器所发起的请求,session也会不一样

3.1 React前端实现跨域
前端使用代理服务器对后台的API请求进行转发, 添加proxy配置如下图所示:
在这里插入图片描述

3.2 后台服务端设置
如果Cookie中设置了HttpOnly属性,那么通过前端将无法读取到Cookie信息,Session对应的session id就无法发送到服务端,服务器会认为这是一次新的请求,会重新生成新的session id并返回给前台。这样的请求session是无法保持一致性的。需要设置Cookie的HttpOnly属性为false才能读取的session id。
在前面设置中已经把Session由Spring- Boot Session保存到Redis中,以此来保证服务器集群下的Session共享。简单的设置Cookie的HttpOnly属性不能满足要求,我们需要设置Spring-Boot中的属性值。
在Spring-Boot中默认的情况下,使用的是CookieHttpSessionStrategy,这种策略将允许使用setCookieSerializer来指定Cookie的各种属性,具体设置如下
在这里插入图片描述
设置cookieSerializer的httpOnly为false,以此来保证前端可以读取到cookie信息,并发送到后台。

4.总结

本文分析了常见的Session共享的实现方式以及Session不一致的常见问题,和解决方案。
本文论述Session共享问题步骤解决:
1. 用Redis实现保存Session信息
基于Cache DB缓存的Session共享,可以在服务器故障时保存信息,实现共享和高可用,是现在常用的Session共享的方式。利用Spring-Boot Session实现。
2. Session跨域问题
利用前端使用代理服务器,解决跨越问题,以此保证Session的一致性。
3. HttpOnly
因为HttpOnly的设置使前端无法读取到Cookie中的Session id 并将Session id发送到服务器,后台需要Spring-Boot Session 中设置cookieSerializer属性

参考文献

[1] spring boot–整合spring session实现session共享以及cookie丢失问题解决 https://blog.csdn.net/liuchuanhong1/article/details/78432401?locationNum=2&fps=1
[2] react闲谈——用proxy 1分钟解决跨域问题Script Https://www.aliyun.com/jiaocheng/990663.html
[3]什么是HttpOnly https://www.cnblogs.com/softidea/p/6040260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值