Tomcat session复制及session共享技术

目录

[session 复制](#session 复制)

1、环境

3、添加session测试页面

4、修改配置

[5、 在web.xml中添加标签](#5、 在web.xml中添加标签)

6、访问测试

7、个人看法


前言:

为什么要做session复制或共享

Session共享是指在多个服务器之间共享用户会话数据的能力,这对于构建高可用性和可伸缩性的Web应用程序至关重要。

实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享,以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因:

  1. 高可用性和容错性:通过复制或共享Session,当一个Tomcat实例发生故障或停机时,其他实例可以接管并继续处理用户请求,而不会丢失Session数据。这确保了应用程序的高可用性和容错性。

  2. 负载均衡:当有多个Tomcat实例运行时,Session复制或共享可以实现负载均衡。用户的请求可以分散到不同的实例上,提高系统的整体性能和吞吐量。

  3. 无状态化应用设计:通过将Session数据从应用服务器中移出,可以使应用程序变得更加无状态化。这意味着每个请求可以独立处理,不依赖于特定的服务器状态,从而提高应用程序的可扩展性。

  4. 保持用户会话状态:通过Session复制或共享,用户的会话状态可以在多个请求之间得到保持。这对于需要跨页面或多个请求保持用户身份、购物车信息、用户首选项等状态非常重要。

session 复制

1、环境

本实验环境步骤基于Tomcat多实例配置-CSDN博客

服务 ip 系统
nginx 192.168.226.20 rocky_linux9.4
tomcat1 192.168.226.20:8080 rocky_linux9.4
tomcat2 192.168.226.20:8081 rocky_linux9.4
tomcat3 192.168.226.20:8082 rocky_linux9.4

确保防火墙、selinux关闭,时间同步。

3、添加session测试页面

所有tomcat实例都配置

注意修改实例的路径

bash 复制代码
vim /data/application/tomcat1/webapps/ROOT/session.jsp

#下面添加的内容,其中的IP和端口注意修改为对应实例的主机和端口,用来区分打开的是谁,可看图

bash 复制代码
Session_ID: <%= session.getId() %><BR>
Session_Port: <%= request.getServerPort() %><BR>
Session_URL: <%= request.getRequestURL() %><BR>
<% out.println("This tomcat server 192.168.226.20:8080");%>

修改成功后如图

当向后端的三个服务器转发请求 ,由于session没有保持同步或者共享,因此数据会变,例如在商城页面用户登录后,由于跳转页面结果还得再次登录,这样的情况是影响使用的,因此才要做session共享,保持这个用户状态和信息。

4、修改配置

在server.xml中配置,所有tomcat实例都配置,注意修改实例的路径

bash 复制代码
vim /data/application/tomcat1/conf/server.xml +141

#在配置文件中找到Engine name行,在标签内添加jvmRoute,并在下方添加内容 -->

bash 复制代码
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
		

下面是图中在指定位置要粘贴进去的

bash 复制代码
<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>

改完第一个实例,记得把其他tomcat也要改

5、 在web.xml中添加标签

所有tomcat实例都配置

注意修改实例的路径

bash 复制代码
vim /data/application/tomcat1/webapps/ROOT/WEB-INF/web.xml
#<display-name>Welcome to Tomcat</display-name> #再此行下面添加下一行的内容,本行不用加进去
<distributable/>

重启tomcat

#使用这个命令是因为定义过脚本,可用较少命令实现重启

参考Tomcat多实例配置-CSDN博客中的脚本

bash 复制代码
tomcat restart

6、访问测试

http://192.168.226.20/session.jsp

多次刷新,就是想虽然切换了不同后端服务器,但是session就不会改变了。

7、个人看法

复制代码
官方文档: https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
官方建议,不超过四个节点可以使用这个方法,因为他是all-to-all的模式,频繁的广播session信息会造成负载过高
相关推荐
宁波阿成21 小时前
CentOS 7 环境下 Tomcat 8.5 升级至 9.0.123 操作总结
linux·centos·tomcat
行者-全栈开发2 天前
【Java中间件】CVE-2026-34486:Tomcat EncryptInterceptor 补丁绕过修复指南
tomcat·cve-2026-34486·encryptintercep·会话复制·集群安全·补丁绕过·cwe-311
景熙55233 天前
2.什么是业务后台系统
java·spring·tomcat·mybatis·jdbc
无巧不成书02183 天前
Tomcat部署JSP文件完整指南:手动部署+IDEA工程化实现 附404访问错误全排查
java·ide·windows·tomcat·intellij-idea·js
weixin_BYSJ19874 天前
电竞先锋网站---附源码02032
java·vue.js·spring boot·python·django·tomcat·php
2301_32241428045 天前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
BioRunYiXue6 天前
使用docker分析高通量测序数据
java·数据库·人工智能·spring cloud·docker·tomcat·html
paopaokaka_luck6 天前
美食推荐系统(协同过滤算法推荐、AI助手、HanLP中文分词、 ECharts可视化分析、菜谱学习与话题交流)
java·spring boot·mysql·tomcat·echarts
鬼手点金7 天前
单轮对话:最简单的 API 调用
java·服务器·前端·javascript·react.js·servlet·tomcat
慧都小项7 天前
图解 MyEclipse Deployment Assembly:资源如何进入部署产物?
java·ide·tomcat·maven·myeclipse·部署排查