session共享问题及四种解决方案-前端存储、session的复制 、session粘性、后端存储(Mysql、Redis等)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
简介: session共享问题及解决方案

tomcat的安装与配置


tomcat的安装

官网下载

Apache Tomcat官网

我下载的版本为8.5.82

7e354ff584b74ca780399b8490b042ca.png

解压两份

a97adaace08743d0be95900e6825f518.png

tomcat集群的配置


官网提供的配置f1a3242f29d94d73a7d2977f528b8433.png7d23fc889de94f8b96035ffc52eac3aa.pngfda2f588963f4ee99b4b239b97ed1607.png

官网配置地址

c560ac8546ee42b494d6b0fe1545a807.png

我的配置步骤

  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

1、将上面的复制到两个tomcat的server.xml配置文件中

aadbe1a6fd1b44af81387a16dd4c32ea.png

2、改端口

为啥改端口:因为我只有一台电脑


只要不与tomcat1相同就行

f1a3242f29d94d73a7d2977f528b8433.png7d23fc889de94f8b96035ffc52eac3aa.pngfda2f588963f4ee99b4b239b97ed1607.png


3、在tomcat1和tomcat2中的webapps\ROOT目录下删除页面然后加上这三个页面


第一个是index,第二个是login,第三个是logout

index是首页,login是设置session,logout是删除session

把tomcat2改为tomcat1然后继续复制

80ccadf49bc94ffcaf21987bfa22fb3f.png

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
  <title>
  tomcat2
  </title>
  </head>
    <body>
        SessionID:<%=session.getId()%>
    <br>
        SessionValue:<%=session.getAttribute("session")%>
        <br>
    SessionIP:<%=request.getServerName()%>
        <br>
    SessionPort:<%=request.getServerPort()%>
    <br>
        <%
            out.println("this is tomcat 2");
        %>
    </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
  <title>
  tomcat2
  </title>
  </head>
    <body>
        <%
      session.setAttribute("session","libo");
    %>
        <%
            out.println("this is set SessionValue success");
        %>
    </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
  <title>
  tomcat2
  </title>
  </head>
    <body>
        <%
      session.removeAttribute("session");
    %>
        <%
            out.println("this is remove SessionValue success");
        %>
    </body>
</html>


session问题解决方法


前端存储

原理

每次前端发请求时候都把这个携带走

4909059c93fb438baa6d6a29cd5169ca (1).png

优缺点

优点

不占用服务端内存


缺点

存在安全风险

数据大小受cookie限制

占用外网宽带


session的复制

操作步骤

在每个tomcat 的 “webapps\ROOT\WEB-INF\web.xml” 里面加上 distributable标签

e51cf65ffef444be8e9ced407ab2c1b3.png

都没有登录05d7e0229a36468592abd08f23b5fbbe.png

tomcat1登录

a464ebfd58334b6b8ed5e1334fbad6a6.png

tomcat2查看是否可以获取数据

获取成功8d8ea8de9d134fb49f244b64d6312564.png


tomcat1退出

b528729fd1b44e7a99ffd50325cc17be.png

tomcat2查看是否可以获取数据

获取不到了,因为session是共享,已经在tomcat1那里退出登录了

495cf848e3b9456f84ef728bcbc72a3e.png

原理

多个server之间相互同步session,这样每个server之间都包含全部的session

631068384eea4249a46d73f3b50066b4.png

优缺点

优点

1、只需要设定配置,应用程序不需要修改代码

2、有一台机器挂了,其他机器还保存有


缺点

1、ession的同步需要数据传输,占内网带宽,有延时

2、所有server都包含所有session数据,数据量受最小内存的sever限制


session粘性

操作步骤

下载安装nginx

官网下载,我是已经下载过的了

CSDN博客找篇按照下载


配置nginx.conf

这样就会轮询两个tomcat服务器

e4c36920337b481b80d4e519695e53d3.png

把刚才tomcat里面的web.xml去掉distributable标签

访问localhost然后就会一直是一个tomcate21a730aafb5413b85cba7c32e902bdb (1).png

注意

fc05d8db557f41cba5be75bd7f26a312.png

原理

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

b57e19917ee54ea3b9ba346b23fee7b8.png

优缺点

优点

无需修改代码

服务端可以水平扩展


缺点

如果某台服务器挂掉了,Session就会丢失

如果一个局域网内大量用户那么也没啥用了(使用默认的ip_hash算法)


后端存储(Mysql、Redis等)

原理都是一样的,但是如果要是海量请求同时发送,请求数据库,容易造成数据库的压力过大从而崩溃,所以我们演示是基于Redis

操作步骤

访问我仓库下载代码

点击进入

原理

传统模式中,当request进入web容器,根据request获取session时,如果容器内存在session则返回,如果不存在就创建一个session然后返回,将sessionId返回

后端存储就是将session从容器里面抽出来,形成独立的模块,以便分布式或者集群能够共享。当request进入容器时,根据request获取session时,去找redis如果存在就返回,如果不存在就创建并存储

239d9b23b77846f18c0c6ac41974b255.png

优缺点

优点

代码灵活,对web容器无侵入

速度比mysql更快


缺点

需要编写代码


239d9b23b77846f18c0c6ac41974b255.png239d9b23b77846f18c0c6ac41974b255.png

相关文章
|
2月前
|
缓存 NoSQL 关系型数据库
MySQL 与 Redis 如何保证双写一致性?
我是小假 期待与你的下一次相遇 ~
374 7
|
存储 前端开发 安全
前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
本文全面解析前端三种数据存储方式:Cookie、LocalStorage与SessionStorage。涵盖其定义、使用方法、生命周期、优缺点及典型应用场景,帮助开发者根据登录状态、用户偏好、会话控制等需求,选择合适的存储方案,提升Web应用的性能与安全性。(238字)
535 0
|
5月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
7月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
379 5
|
3月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
205 5
|
7月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
444 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
7月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
401 41
|
7月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
516 17
|
7月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
164 18

热门文章

最新文章

  • 1
    我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
  • 2
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
  • 推荐镜像

    更多