Session共享的解决方案

article/2025/9/16 17:00:17

Tomcat下集群Session共享的4个方案

问题引入

在这个分布式结构下,如果不用共享session的话,就会出现问题。当一个客户端发送一个请求(无session),通过nginx将第一次请求分发给服务器1,服务器判断无session,就让那个客户进行登录操作,并得到响应,此时客户端会存储一个来自服务器1响应的session,并存储在客户端。

当客户端发送第二次请求的时候,此时本次请求已经携带了session(跳过登录),nginx却将请求分发给服务器2,因为服务器2中没有session,所以无法与客户端session进行对应。所以程序会出现异常或是报错,无法正常响应。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IudWVfBH-1663485552542)(readme.assets/image-20220918143746017.png)]

1.Tomcat内置的Session复制方案

通过修改Tomcat相关的配置文件里面的配置,从而实现Tomcat集群中每个Tomcat都会储存其他Tomcat里面的Session,从而实现Tomcat集群中每台Tomcat的Session共享

优点:

  • Java代码上不需要做任何修改

缺点:

  • 依赖应用服务器容器,这里是Tomcat,其他的容器是使用不了的;

  • 适合小集群,不适合大集群,因为Session的复制是 all to all的,每个Tomcat都会存储其他的Session,会造成很大的资源浪费

在高并发的情况下延迟较为严重且占用网络资源。

2.使用Session粘滞方案

可以通过某种形式,将用户的每次请求都固定到某一台机器上。例如通过Nginx的ip_hash策略进行负载均衡,只要用户的IP固定不变,总能访问到同一台服务器上。举例如下:

upstream backend{<!--加上这行 ip_hash-->ip_hash;server 192.168.128.1:8080 ;server 192.168.128.2:8080 ;
}
server {listen 8081;server_name test.csdn.net;root /home/system/test.csdn.net/test;location ^~ /Upload/upload {proxy_pass http://backend;}
}

优点:

  • 不需要修改项目代码,没有额外开销

缺点:

  • 如果某台服务器挂掉了,Session丢失,所有被分发到这台服务器的请求都会发生故障,然后转向其他服务器,从而重新登录进行操作;

  • 如果是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。

3.基于Session持久化方案

将Session存储到Mysql数据库中(一般很少用这种方案)

优点:

  • 可以从数据中查询Session中存储的相关数据

缺点:

  • 要是海量请求同时发送,请求数据库,容易造成数据库的压力过大从而崩溃

4.使用Redis解决(我们的方案)

使用Redis解决是基于token实现的,没发起一次请求都会携带token。而如果用户要是存在的话,用户信息就会存储到Redis中。每次发送请求的时候,都会携带token,而后台获取token从而查询Redis中是否存在相关用户的相关信息,这样不管是任何一台服务器,都会从Redis中查询相关信息。这样就解决了Tomcat集群下Session无法共享的问题,而Redis也可以对相关信息进行脱敏处理,一定程度上保证了安全。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v7rojWWj-1663485552544)(readme.assets/image-20220918143852260.png)]

优点:

  • 代码灵活,基于分布式Redis,可以实现对高并发请求的支持。

缺点:

  • 需要修改的代码较多,涉及到Session的地方都需要更改。不太适合对老系统的改造,比较适合于新开发的系统。但是如果我们提前将用户接口抽离成了一个单独的服务,那么改造起来还是比较好处理的。

测试结果:

1.问题展示

我们先用第一台服务器访问用户数据,请求携带session的id从而后台进行查询,就可以得到用户的相关信息

这时候我们换第二三台服务器进行测试(第三台与第二台)

在这里插入图片描述

得到的结果都如下:

在这里插入图片描述

2.redis解决

使用服务器1访问用户信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mURz3078-1663485552551)(readme.assets/image-20220918150810928.png)]

使用服务器2访问用户信息:

在这里插入图片描述

使用服务器3访问用户信息:

在这里插入图片描述
使用redis实现了用户信息在tomcat集群中的共享


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

相关文章

Spring Cloud Gateway中session共享

Spring Cloud Gateway中session共享 背景 在进行zuul切换到gateway时&#xff0c;需要重新实现session共享&#xff0c;本文主要分享一下自己实现的方案。 zuul中的session共享 在zuul中&#xff0c;是通过spring-session-data-redis这个组件&#xff0c;将session的信息存…

Nginx - session共享

1.负载均衡 session问题 通过负载均衡&#xff0c;我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力&#xff0c;但是这里存在一个问题&#xff1a; 当同一个用户第一次访问tomcat_8111 并且登录成功&#xff0c; 而第二次访问却被分配到了tomcat_8222&#xff0c; 这里…

Spring Session + Redis实现Session共享

功能需求 通常情况下&#xff0c;Tomcat的Servlet容器会默认将Session保存在内存中。如果是单个服务器实例的应用&#xff0c;将Session保存在服务器内存中是一个常用的选择&#xff0c;但是随着服务器数量的增多&#xff0c;这种方法变得不容易扩展。 比如上图中&#xff0c…

nginx实现session共享

在nginx实现了负载均衡之后&#xff0c;用户第一次请求的tomcat和第二次请求的tomcat基本不是同一个&#xff0c;但是你在第一次请求放在session中的值只有一个tomcat1才有&#xff0c;第二个请求的那个tomcat2里面是没有的。这样就出现了用户不停登入的情况。为了解决这个sess…

tomcat配置session共享

tomcat官网 打开 tomcat 官网&#xff1a; http://tomcat.apache.org/ &#xff0c; 找到需要配置的tomcat版本的文档&#xff0c;这里以 tomcat7 为例&#xff0c; 找到对应的 Clustering 配置&#xff08;因为配置session共享&#xff0c;就是配置集群&#xff09;&#xff…

Nginx——Session共享

文章目录 其他文章1、Session共享1.1、session 一致性解决方案1.1.1、session 复制1.1.2、共享 session 1.2、安装memcached1.2.1、 node2 和 node3 上安装 jdk 和 tomcat1.2.2、nginx1 上安装 memcached 其他文章 Nginx——安装Nginx1.6.1 Nginx——工作模型 Nginx——配置文…

Springboot整合springsession实现session共享

Springboot整合springsession实现session共享 简介 session我们之前有介绍过&#xff08;可见springboot整合springsecurity&#xff09;&#xff0c;简单来说就是将用户信息或者数据存储在服务器上&#xff0c;通常用于验证用户身份或者避免通过获取相关信息。 但是&#x…

集群产生的session共享问题

前言&#xff1a; 为了解决集群产生的session共享问题&#xff0c;我们首先需要知道以下三个概念&#xff1a; cookiesessionnginx ​ 下面将逐个分析。 Cookie 1.Cookie是什么 ​cookie的中文翻译是曲奇&#xff0c;小甜饼的意思。cookie其实就是一些数据信息&#xff0c…

Websocket Session 共享解决

Websocket Session 共享解决&#xff08;方案一&#xff09; 既然Websocket Session 不能直接序列化然后存储&#xff0c;而且如果用户请求的时候&#xff0c;开始与集群中的A 节点创建链接&#xff0c;就算把这个 Session 拿到B 节点去再给用户Push 消息&#xff0c;应该也…

使用redis实现session共享

继上一遍文章&#xff0c;使用nginx实现负载均衡以后&#xff0c;新的问题又产生了&#xff0c;当使用负载均衡以后&#xff0c;我们如何实现session共享&#xff0c;因为session是保存在服务端的&#xff0c;对于单体应用来说这不是问题&#xff0c;因为只有一个服务器&#x…

Session共享问题-session原理

问题1&#xff1a;微服务情况下。域名不同。session不共享 问题2&#xff1a;分布式系统下。同一个域名下&#xff0c;多个服务。session会出现不同步问题&#xff08;例如第一次访问的是A服务&#xff0c;保存了。第二次访问了B,查询到的还是没信息&#xff09; 解决&#xf…

Springboot:Session共享

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

Java -- SpringSession实现session共享

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

shiro分布式session共享

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

tomcat+redis实现session共享

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

Session共享问题

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

session共享(redis实现)

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

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

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

session共享几种方式

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

session共享学习

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