当前位置: 首页 > news >正文

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

👨‍💻个人主页: 才疏学浅的木子
🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️
📒 本文来自专栏: 常用工具类以及常见问题处理方法
🌈 每日一语越努力越幸运 🌈
❤️ 支持我:👍点赞 🌹收藏 🤟关注

session共享问题及解决方案

  • tomcat的安装与配置
    • tomcat的安装
    • tomcat集群的配置
  • session问题解决方法
    • 前端存储
      • 原理
      • 优缺点
    • session的复制
      • 操作步骤
      • 原理
      • 优缺点
    • session粘性
      • 操作步骤
      • 原理
      • 优缺点
    • 后端存储(Mysql、Redis等)
      • 操作步骤
      • 原理
      • 优缺点

tomcat的安装与配置

tomcat的安装

官网下载

Apache Tomcat官网

我下载的版本为8.5.82

在这里插入图片描述

解压两份

在这里插入图片描述

tomcat集群的配置

官网提供的配置

官网配置地址

在这里插入图片描述

我的配置步骤

  <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配置文件中

在这里插入图片描述

2、改端口

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

只要不与tomcat1相同就行

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
3、在tomcat1和tomcat2中的webapps\ROOT目录下删除页面然后加上这三个页面

第一个是index,第二个是login,第三个是logout
index是首页,login是设置session,logout是删除session
把tomcat2改为tomcat1然后继续复制

在这里插入图片描述

<%@ 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问题解决方法

前端存储

原理

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

在这里插入图片描述

优缺点

优点
不占用服务端内存

缺点
存在安全风险
数据大小受cookie限制
占用外网宽带

session的复制

操作步骤

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

在这里插入图片描述

都没有登录

在这里插入图片描述
在这里插入图片描述

tomcat1登录

在这里插入图片描述

tomcat2查看是否可以获取数据

获取成功

在这里插入图片描述
tomcat1退出

在这里插入图片描述

tomcat2查看是否可以获取数据

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

在这里插入图片描述

原理

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

在这里插入图片描述

优缺点

优点
1、只需要设定配置,应用程序不需要修改代码
2、有一台机器挂了,其他机器还保存有

缺点
1、ession的同步需要数据传输,占内网带宽,有延时
2、所有server都包含所有session数据,数据量受最小内存的sever限制

session粘性

操作步骤

下载安装nginx

官网下载,我是已经下载过的了
CSDN博客找篇按照下载

配置nginx.conf

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

在这里插入图片描述
把刚才tomcat里面的web.xml去掉distributable标签

访问localhost然后就会一直是一个tomcat

在这里插入图片描述
注意

如果还是轮询的话,可能是配置文件没有生效
去任务管理器关闭所有带有nginx的进程
在这里插入图片描述

原理

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

在这里插入图片描述

优缺点

优点
无需修改代码
服务端可以水平扩展

缺点
如果某台服务器挂掉了,Session就会丢失
如果一个局域网内大量用户那么也没啥用了(使用默认的ip_hash算法)

后端存储(Mysql、Redis等)

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

操作步骤

访问我仓库下载代码
点击进入

原理

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

在这里插入图片描述

优缺点

优点
代码灵活,对web容器无侵入
速度比mysql更快

缺点
需要编写代码

相关文章:

  • 算法篇-------贪心2
  • Python图像处理笔记
  • 基于51单片机的舞蹈机器人四路步进电机控制仿真
  • 8、如何使用FactoryBean向Spring容器中注册bean?
  • 知识蒸馏 | YOLOv7知识蒸馏实战篇 | 2/2*
  • MySQL纯代码复习(上)
  • [附源码]Python计算机毕业设计白果园网上水果超市
  • 【JVM】java的jvm类加载器和类加载子系统
  • 正则表达式(常用最新版)
  • NX二次开发-调内部函数SEL_set_type_filter_index_by_label设置类型过滤器例子剖析怎么查找内部函数调用内部函数
  • 李峋同款爱心代码
  • VMware 网络模式
  • 缓存穿透、缓存击穿、缓存雪崩区别和解决方案
  • SpringBoot--获取路径中的参数(x-www-form-urlencoded)--方法/实例
  • call()、apply()、bind() 区别、使用场景、实现方式
  • [译]前端离线指南(上)
  • 【译】理解JavaScript:new 关键字
  • conda常用的命令
  • JavaScript函数式编程(一)
  • Java多线程(4):使用线程池执行定时任务
  • js递归,无限分级树形折叠菜单
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • sessionStorage和localStorage
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Twitter赢在开放,三年创造奇迹
  • 力扣(LeetCode)21
  • 如何学习JavaEE,项目又该如何做?
  • 使用 @font-face
  • 使用API自动生成工具优化前端工作流
  • 一些css基础学习笔记
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 选择阿里云数据库HBase版十大理由
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​力扣解法汇总946-验证栈序列
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Matlab)使用竞争神经网络实现数据聚类
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (数据结构)顺序表的定义
  • (原創) 未来三学期想要修的课 (日記)
  • .NET Micro Framework初体验
  • .Net MVC4 上传大文件,并保存表单
  • .NET Reactor简单使用教程
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 药厂业务系统 CPU爆高分析
  • .NET的数据绑定
  • .NET值类型变量“活”在哪?
  • @GetMapping和@RequestMapping的区别
  • @staticmethod和@classmethod的作用与区别
  • [ 数据结构 - C++]红黑树RBTree