tomcat配置session共享

article/2025/9/17 9:38:33

tomcat官网

打开 tomcat 官网: http://tomcat.apache.org/ , 找到需要配置的tomcat版本的文档,这里以 tomcat7 为例,

1-选择tomcat7文档

找到对应的 Clustering 配置(因为配置session共享,就是配置集群),如下图
2-tomcat官网7的文档首页-cluster

即,配置tomcat7集群的文档地址: http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

配置session共享

1.阅读官方文档

3-tomcat7配置cluster文档

如上图官方的文档中所说,只需配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 节点即可

2.修改server.xml配置

但其实在 tomcatconf/server.xml 的配置文件中,已经有此项配置,只是被注释了,只需将注释 打开 即可,如下图

4-tomcat的server.xml文件cluster的配置

3.准备测试环境

此时,准备一个 tomcat ,如上打开 conf/server.xmlCluster 的节点配置,再准备一个简单的 javaWeb应用(打印 sessionId,做验证配置是否成功),放到 tomcatwebapps 目录下

打印 sessionIdjsp 如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session replication</title>
</head>
<body><br/><br/><br/><br/><br/>SessionID:<%=session.getId() %>
</body>
</html>

因为是在本地做验证,所以,再将以上配置完成的 tomcat 再复制一份,然后修改 tomcat 的端口,这里我两个 tomcat 的应用端口是 80818082,如下图所示

5-两个tomcat的端口配置图片

tomcatwebapps 目录,如下

6-两个tomcat的web应用

4.测试失败

修改完成配置之后,分别启动 tomcat,打开浏览器测试之后,如下

7-浏览器测试sessionId不一致

测试发现,两个 tomcatsessionId 并不一致?!

另外,还发现了一个问题,就是 来回刷新 浏览器的 两个tomcat的应用 的index.jsp,浏览器显示的 两个 sessionId 在不断的变化 ,但是这个问题跟配置 session共享 无关,是 cookie的作用域 导致的,后续再单独写一篇笔记讲。

5.查漏补缺

此时我们再返回 tomcat 官网配置 Cluster 的文档处,继续阅读,找到其中的 Cluster Basics 标签那,如下图所示,

8-tomcat配置session共享需要完成的步骤

文档中,说要配置 session复制 必须完成以下几步:

  • session 的所有 attributes 必须实现 java.io.Serializable (√)
  • 在 server.xml 的配置文件中,把 Cluster 的注释打开 (√)
  • 如果有自定义的集群 Valve(tomcat过滤器),就需要在 server.xml 的 Cluster 节点下配置 ReplicationValve (x,没有,不用管)
  • 如果集群的 tomcat实例 在同一台机器上,需要确保的你的 Receiver.port 不要有冲突,然后还顺道赞美了他家的 tomcat ,在大部分场景下能够自动检测4000-4100范围内的可用端口来,解决此问题 (√,默认配置就已经支持了)
  • 需要在 web应用 的 web.xml 文件中,配置 <distributable/> 节点 (x,这个没有配)
  • 如果集群用到了 mod_jk,就要在 server.xml 的 Engine 节点配置 jvmRoute 的属性,如<Engine name="Catalina" jvmRoute="node01" > 并且 jvmRoute 属性值与 workers.properties 中的 worker name 匹配 (x,没配,不用管)
  • 集群的所有节点,系统时间要一致,并与 NTP service 同步 (√,同一台机器)
  • 将负载均衡服务器(apache、nginx等),配置为粘性会话模式 (x,暂时没有配负载均衡,不用管)

所以,意思就是,conf/server.xml 中配置了 Cluster 节点外,还需要在 web应用web.xml 文件里面配置 <distributable/> 节点,如下图所示

9-web应用的web.xml文件配置distributable节点

6.重新测试

配置完成之后,重新启动两个 tomcat,重新刷新浏览器的页面,此时如下图所示,sessionId 已经一致,即 session共享 配置成功。

10-浏览器测试sessionId一致

探究

1.Cluster 节点的默认配置是什么?

上文在官网中截取的,配置 Cluster 节点的图,如下所示,

3-tomcat7配置cluster文档

图中最后提到的,The following is the default cluster configuration 如下配置,

		<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.MessageDispatch15Interceptor"/></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.JvmRouteSessionIDBinderListener" /><ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" /></Cluster>

即配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 与上面这一大段的配置内容,效果是一样的,但是这样一来,细粒度越小,可以调整的内容也就越多

在上面的这么多配置中,需要注意的是,address="228.0.0.4" 这个地址为 组播地址,属于 ip地址 中的 D类地址

11-Cluster完整默认配置的组播地址

这个地址可以改,但是只能改为另一个组播地址。如果随便填一个非组播地址,tomcat启动的时候会报一个 Not a multicast address 的错误,这个报错来自 javajava.net.MulticastSocket,如下所示,

12-net包报不是一个组播地址的错误

在配置了 Cluster 节点之后,tomcat启动的过程中,会调用 org.apache.catalina.tribes.membership.McastServicestart() 方法,然后在方法中验证 address 的值是否是一个组播地址D类地址,它的第1个字节的前四位固定为 1110,即 ipv4 的地址的下限为 224.0.0.1

13-Inet4Address的isMulticastAddress方法

2.tomcat之间如何进行session复制的通信?

tomcat 文档的最后,有讲到这个问题:

当配置了 Cluster 节点的 tomcat 启动的时候,会创建 Host 对象,并用一个集群对象与之关联。启动过程中,到了解析 Context (即 web应用)的时候,如果 web应用web.xml 配置了 <distributable/> 的节点,则 Cluster 的对象会创建一个 manager 去管理 session复制。之后,Cluster 的对象将启动一个 membership 的服务(多播)和一个 replication 的服务(tcp单播)。下图是关于上述描述的 tomcat源码

14-tomcat源码cluster创建manager管理session复制

Tomcat 之间的 session replication 通信是使用简单的 多播ping 建立的。每个 Tomcat实例 将定期发出 多播ping,在 ping消息 中,会包含 Tomcat实例IPTCP侦听端口 去进行 与其他实例的 session复制。如果 Tomcat实例 在给定的时间范围内没有收到此类ping,则该成员被视为已死。

Tomcat实例 收到 组播ping,该成员就会被添加到集群中,在下一个复制请求时,发送实例将通过集群的成员列表侦听的 ip和端口 信息(单播)建立 TCP Socket连接,进行 session复制

组播传输:在发送者和每一接收者之间实现点对点网络连接,如果一台发送者同时给多个接收者传输相同的数据,也只需要复制一份的相同数据包,它提高了数据的传输效率。

在因特网中的IP组播也是用组播组的概念,每个组都有一个特别分配的地址,要给该组发送的计算机将使用这个地址作为分组的目标地址。在IPv4中,这些地址在D类地址空间中分配,而IPv6也有一部分地址空间保留给组播组。

需要注意的是,主机组播时仅发送一份数据,只有数据在传送路径出现分岔时才将分组复制后继续转发。

15-单播与组播的比较

即,Tomcat 启动时,发送 组播ping 建立集群的成员列表。在下一个 session复制 的请求时,根据集群成员列表的各成员侦听的 ip和端口,逐一建立 socket连接 ,进行 session复制


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

相关文章

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…

redis实现session共享

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

UART协议概述与实现

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

UART协议简述及编程

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

UART协议及串口回环

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

基于verilog的uart协议实现

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