Session共享问题-session原理

article/2025/9/16 17:09:27

 

 

 

 

 问题1:微服务情况下。域名不同。session不共享

问题2:分布式系统下。同一个域名下,多个服务。session会出现不同步问题(例如第一次访问的是A服务,保存了。第二次访问了B,查询到的还是没信息)

 解决:1)、session复制(同步)

web-server Tomcat )原生支持,只需要修改配置 文件
缺点:
1.复制数据走网络,占用网络传输资源,降低了服务器处理业务能力
2.没台服务器总有饱和状态(手内存限制),没发水平扩展
3、大型分布下数据量太多。不适合。

 

2)、客户端存储
优点:服务器不存储,用户自己报错session信息到cookie中,节省服务端资源
缺点:cookie有长度限制4K,不能大量存储信息,数据不安全容易被窃取

 

3)、hash一致行

就是配合负载均衡记录客户端的ip路由到自己访问的服务器(ip求余) 

优点

只需要改 nginx 配置,不需要修改应用代码
负载均衡,只要 hash 属性的值分布是均匀的,多台 web-server的负载是均衡的
可以支持 web-server 水平扩展( session 同步法是不行 的,受内存限制)

缺点

session 还是存在 web-server 中的,所以 web-server 重 启可能导致部分session 丢失,影响业务,如部分用户 需要重新登录
如果 web-server 水平扩展, rehash session 重新分布, 也会有一部分用户路由不到正确的session
但是以上缺点问题也不是很大,因为session本来都是有有效期的。

 4)、统一存储

就是用redis存储

优点:

没有安全隐患

可以水平扩展,一个redis不行就,做多个redis集群

服务器重启也不会有数据丢失

缺点:

增加了一次网络调用,增添代码。远程获取数据,比从内存中获取数据慢

代码就是Map集合存储

总结用SpringSession解决

 以上4中解决方法前提都是在同一域名下。

针对不同域名,不同服务,子域session共享

 

 

问题就是浏览器在做Cookie的时候会指定域名。源码就是HttpServletResponse 的addCookie方法的setDomain()方法。
response.addCookie(new Cookie("JESSIONID","dada").setDomain(""));

SpringSession核心原理

SessionRepositoryFilter:
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {request.setAttribute(SESSION_REPOSITORY_ATTR, this.sessionRepository);SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryRequestWrapper(request, response, this.servletContext);SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryResponseWrapper(wrappedRequest, response);try {filterChain.doFilter(wrappedRequest, wrappedResponse);}finally {wrappedRequest.commitSession();}}

     SessionRepositoryRequestWrapper wrappedRequest = new      SessionRepositoryRequestWrapper(request, response, this.servletContext);

包装原始的请求对象:装饰着模式

SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryResponseWrapper(
                wrappedRequest, response);

包装原始的相应对象
 


http://chatgpt.dhexx.cn/article/vwIE4SqQ.shtml

相关文章

Springboot:Session共享

1、概述 传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。这里的限制是,session存储在web容器中&#xff0c…

Java -- SpringSession实现session共享

在集群系统中,经常需要将 Session 进行共享。不然会出问题:用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,系统B发现本机上没有这个用户的 Session ,会强制让用户重新登陆。 如在同域名&#xff0c…

shiro分布式session共享

当我们开发的程序需要跑在多个tomcat容器或者多台机器上时,shiro的默认session存储就不能满足我们的需求了,其中shiro默认的session是存储在运行jvm内存中的,使用的AbstractSessionDAO抽象类的一个子类MemorySessionDAO,当我们需要…

tomcat+redis实现session共享

注意:在实际应用中,发现该方案会不定期导致Tomcat假死(怀疑Redis连接未释放),慎用。 服务器192.168.14.132和192.168.14.133, 均已经安装tomcat,tomcat安装过程不再赘述。 采用192.168.14.132…

Session共享问题

Session共享及Session保持或者叫做Session⼀致性 1、Session问题原因分析 出现这个问题的原因,从根本上来说是因为Http协议是无状态的协议。客户端和服务端在某次会话中产生的数据不会被保留下来,所以第⼆次请求服务端无法认识到你曾经来过,…

session共享(redis实现)

引言 大厂很多项目都是部署到多台服务器上,这些服务器在各个地区都存在,当我们访问服务时虽然执行的是同一个服务,但是可能是不同服务器运行的; 在我学习项目时遇到这样一个登录情景,假设有如下三台服务器&#xff0…

如何实现session共享的几种解决方案?

先了解一下为什么会出现这种session共享的解决方案? 随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题当用户进行一个session会话的时候,比…

session共享几种方式

Session共享三种方式 1.nginx基于ip_hash负载均衡。 只需要更改nginx.conf配置文件。添加ip_hash就可以了。 缺点:1.由于ip_hash分配tomcat的时候用的是除法,所以新添加一台服务器会导致分配不到原来程序上,session会丢失。2.同一个公网ip…

session共享学习

一、Session共享 1 什么是Session共享    是指在一个浏览器对应多个Web服务时,服务端的Session数据需要共享。 2 Session共享应用场景 单点登录Web服务器集群等 3 Session共享常见的解决方案 3.1 Session复制       通过对应用服务器的配置开启服务器的Sess…

redis实现session共享

session共享 什么是session? 由于 HTTP 协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户。Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Sessi…

UART协议概述与实现

UART协议概述(一) 协议描述关键代码逻辑写在最后 协议描述 常见的三大低速通信协议之一,UART,通用异步收发协议。非常简单的协议,协议细节不需要多说,只说需要注意的点。空闲位为高位,起始位为…

UART协议简述及编程

UART原理简述 通用异步收发器简称UART(universal asynchronous receiver transmitter)。他的用途很广泛,一般常用的就是用来输出打印的信息,也可以外接各种模块,例如GPS和蓝牙等。 正是因为这种协议非常的简单可靠&…

UART协议及串口回环

UART协议及串口回环 一、异步通信的分类1、UART(通用异步收发器)2、RS4223、RS4854、Modbus5、接口标准 二、UART协议要求1、空闲状态2、起始位3、数据位4、校验位5、停止位6、波特率7、比特率 三、汉字发送四、串口回环uart_txuart_rxctrltop 五、参考六…

基于verilog的uart协议实现

目录 1、理论介绍 2、架构设计 3、代码设计 一、发送模块代码 二、接收代码设计 三、顶层模块设计 四、测试代码 4、仿真实验 1、理论介绍 uart:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是一种串行的收发方式…

UART协议快速扫盲(图文并茂+超详细)

文章目录 1 UART发展历史1.1 早期的串行通讯设备1.2 早期的芯片级UART1.3 现代UART的发展 2 预备知识3 协议层起始位数据校验位停止位波特率 4 传输过程5 物理层6 优缺点 1 UART发展历史 1.1 早期的串行通讯设备 早期的电报机器使用长度可变的脉冲信号进行数据传输&#xff0…

UART协议学习

通信协议分层 物理层 物理层规定通讯系统具有的机械、电子功能部分的特性,确保原始数据在物理媒体的传输。如RS232、RS485等就是电气协议,规定了数据传输时的电平标准,网络上许多博主将UART看作一个协议族,这些电气协议都是UART…

c语言模拟uart协议的收发

这篇文章注重思想的讲解,理解下来肯定对uart协议有一个更深的认识。 uart协议,通常用在嵌入式设备之间的通信。像下面这样: 问题一:uart是全双工还是半双工? 你完全可以将两个设备想象成两个人,上图中的两条线想象成A和B的对话。A对B说话和B对A说话的一个场景。问大家一个问题…

UART协议详解

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。 定义:UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主…

Linux·UART协议

目录 一、什么是UART? 二、UART的帧格式 2.1 为什么UART的传输需要起始位? 2.2 UART基本的数据形式 2.3 为什么UART的数据位可变? 三、UART的波特率 3.1 什么是波特率 3.2 如何换算波特率 3.3 波特率和采样频率是一样的吗&#xff1f…

通信协议(一)——UART协议

1、知识点 基础部分参考:UART串口发送模块设计Verilog_发光中请勿扰的博客-CSDN博客_uart设计verilog (1)什么是串口(UART)? 串口作为常用的三大低速总线(UART、SPI、IIC)之一&#…