Tomcat:Session ID保持会话

目录

前言

​一、部署环境

二、部署nginx反向代理服务器

三、部署tomcat服务器1

四、部署tomcat服务器2

五、客户端测试(Session ID不断变动)

六、配置Session ID会话保持

七、客户端测试(Session ID保持)


前言

此次实验是Tomcat后端服务器如何做Session ID会话保持

一、部署环境

关闭所有设备的防火墙和核心防护

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

安装设备对应的服务软件,如nginx反向代理服务器安装nginx软件,Tomcat服务器1和2需安装tomcat软件

#nginx反向代理服务器
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install -y nginx
[root@localhost ~]#systemctl start nginx

 #Tomcat服务器1和2需安装tomcat软件 

#安装jdk工具,事先准备好oraclejdk二进制包
[root@localhost ~]#cd /opt
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
jdk-8u291-linux-x64.tar.gz
[root@localhost opt]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@localhost opt]#cd /usr/local
[root@localhost local]#ls
bin  etc  games  include  jdk1.8.0_291  lib  lib64  libexec  sbin  share  src
[root@localhost local]#ln -s jdk1.8.0_291/ jdk
[root@localhost local]#vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
[root@localhost local]#. /etc/profile.d/jdk.sh
[root@localhost local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)#安装tomcat,事先准备好tomcat二进制安装包
[root@localhost local]#cd /opt
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#tar xf apache-tomcat-9.0.16.tar.gz 
[root@localhost opt]#cp -r /opt/apache-tomcat-9.0.16 /usr/local/tomcat
[root@localhost opt]#useradd -M -s /sbin/nologin tomcat
[root@localhost opt]#chown -R tomcat:tomcat /usr/local/tomcat/
[root@localhost opt]#cat > /usr/lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
After=syslog.target network.target[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat[Install]
WantedBy=multi-user.targetEOF
[root@localhost opt]#systemctl daemon-reload
[root@localhost opt]#systemctl start tomcat.service

二、部署nginx反向代理服务器

[root@localhost ~]#vim /etc/nginx/nginx.conf
upstream tomcat {server 172.16.12.11:8080;server 172.16.12.12:8080;}location ~* \.jsp$ {proxy_pass http://tomcat;}
[root@localhost ~]#nginx -t
[root@localhost ~]#systemctl restart nginx

三、部署tomcat服务器1

[root@localhost ~]#cd /usr/local/tomcat/webapps/ROOT/
[root@localhost ROOT]#mv index.jsp index.jsp.bak
[root@localhost ROOT]#cat > index.jsp << EOF
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>tomcat test</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
EOF
[root@localhost ROOT]#systemctl restart tomcat.service

四、部署tomcat服务器2

[root@localhost opt]#cd /usr/local/tomcat/webapps/ROOT/
[root@localhost ROOT]#mv index.jsp index.jsp.bak
[root@localhost ROOT]#cat > index.jsp << EOF
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>tomcat test</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
EOF
[root@localhost ROOT]#systemctl restart tomcat.service

五、客户端测试(Session ID不断变动)

客户端访问:http://nginx反向代理服务器IP地址/index.jsp

在实际环境中,不允许用户的Session ID不断变化 

  • 当客户端第一次访问nginx反向代理服务器,nginx反向代理服务器会通过轮询的算法,调度到Tomcat服务器1上处理,由于是第一次访问,客户度的Cookie缓存会记录,不会有Session ID,Tomcat服务器1会生成新的Session ID传输给客户端,客户端会将这个新的Session ID记录下来
  • 当客户端第二次访问的时候,Nginx反向代理服务器又可能通过轮询的算法,将服务请求调度到Tomcat服务器2上处理,Tomcat服务器2是没有客户端传输来的Session ID1的,Tomcat2服务器认为客户端要生成新的Session ID,于是Tomcat2服务器将新的Session ID2传输给客户端,客户端会更新Session ID,将刚刚的Session ID1更改为Session ID2;
  • 当客户端第三次访问的时候,客户端带着Session ID2去Nginx代理服务器,Nginx反向代理服务器将客户端请求又调度到Tomcat服务器1上,Tomcat服务器1并没有Session ID2,于是又将新生成的Session ID3传输给客户端,这样会有很不好的客户端体验,所以我们可以根据修改Tomcat配置文件来进行会话保持

六、配置Session ID会话保持

Tomcat会话保持官方说明:https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html

tomcat服务器1配置: 

[root@node2 ROOT]#vim /usr/local/tomcat/conf/server.xml 
<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="172.16.12.11"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>

[root@localhost ROOT]#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
<distributable/>
[root@localhost ROOT]#systemctl restart tomcat.service
[root@localhost ROOT]#systemctl status tomcat.service

tomcat服务器2配置: 

[root@localhost ROOT]#scp /usr/local/tomcat/conf/server.xml 172.16.12.12:/opt
[root@localhost ROOT]#scp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 172.16.12.12:/opt

[root@localhost ROOT]#cd /opt
[root@localhost opt]#cp server.xml /usr/local/tomcat/conf/server.xml 
cp:是否覆盖"/usr/local/tomcat/conf/server.xml"? y
[root@localhost opt]#cp web.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
cp:是否覆盖"/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml"? y

[root@localhost opt]#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
修改IP地址(tomcat服务器2的IP)
[root@localhost opt]#systemctl restart tomcat.service 
[root@localhost opt]#systemctl status tomcat.service

七、客户端测试(Session ID保持)

客户端访问:http://nginx反向代理服务器IP地址/index.jsp

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言自定义库

编写 xx.c 和xx.h文件\将源代码编译为目标文件 gcc -c add.c sub.c 执行完毕后会生产add.o和sub.o文件静态库创建使用ar命令&#xff1b; ar -r libmymath.a add.o sub.o将库和main.c文件一起编译 gcc -o main main.c -lmymath -L./ 注意 上述书写格式不要错乱 -L 是指定文件路…

鸿蒙-项目创建及了解

目录 项目创建 1.App普通项目创建 2.元服务创建 项目结构 .hvigor .idea AppScope entry EntryAbility.ts pages resources module.json5 ohosTest hvigorfile.ts build-profile.json5 oh_modules build-profile.json5 hvigorfile.ts 项目运行 项目创建 F…

单模场哈密顿量推导

满足麦克斯韦方程和边界条件的单模场又下式&#xff08;1&#xff09;&#xff0c;&#xff08;2&#xff09;给出 --------&#xff08;1&#xff09; ---------&#xff08;2&#xff09; , 单模场的经典场能或者哈密顿量又下式给出&#xff1a; &#xff08;3&#xff09…

JUC并发编程(四)

1、同步模式保护性暂停 用一个线程等待另一个线程的执行结果 有一个结果需要从一个线程传递到另一个线程&#xff0c;让他们关联同一个中间类。如果有结果不断从一个线程到另一个线程那么可以使用消息队列&#xff08;见生产者/消费者&#xff09;。JDK 中&#xff0c;join 的…

WebAssembly探索篇(三)emcc和cmake编译opencv案例

文章目录 开发环境安装opencv环境 实践出真知完整项目效果图 踩坑fatal error: opencv2/opencv.hpp file not found增加软链ln&#xff08;无效&#xff09;改用自行安装opencv&#xff0c;再显示指定lib路径 emcc命令行运行方式 最近因为项目原因&#xff0c;研究了一下WebAss…

C语言例:表达式 45-35+1^2 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int a;a 4&5-3&&51^2;printf("4&5-3&&51^2 %d\n",a);return 0; } 结果如下&#xff1a;

maven一点通

1.maven简介 Maven是一个基于Java的工程构建工具&#xff0c;用于管理和构建项目的依赖关系。它提供了一种标准的项目结构和一组约定&#xff0c;使得项目的开发、构建、部署和文档化更加容易和可靠。 Maven的主要功能包括&#xff1a; 依赖管理&#xff1a;Maven可以自动下载…

课设系统篇

《古代六扇门人员管理系统》 数据库 sixdoor 编码 utf8mb4 视图 查询官员等级 存储过程 CREATE DEFINERrootlocalhost PROCEDURE levelname(IN g_name VARCHAR(20)) BEGINSELECT name,level FROM servingofficials INNER JOIN jobtitle onservingofficials.role jobtitl…

Android性能自测

目录 一、应用启动耗时自测 二、帧率查看 三、Top命令查看系统资源占用 3.1 第一行&#xff1a;任务(进程) 3.2 第二行&#xff1a;mem状态 3.3 第三行&#xff1a;swap交换分区 3.4 第四行&#xff1a;cpu状态 3.5 第五行&#xff1a;标题 四、抓取trace.html文件分析…

基于tcp协议的网络通信(基础echo版.多进程版,多线程版,线程池版),telnet命令

目录 基础版 思路 辅助函数 服务端 代码 运行情况 -- telnet ip 端口号 传输的数据为什么没有转换格式 客户端 思路 代码 多进程版 引入 问题 解决 注意点 服务端 代码 运行情况 进程池版(简单介绍) 多线程版 引入 问题解决 注意点 服务端 代码 …

嵌入式Linux 内核的内存管理方法

内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。 虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏内核运行。 2、 用户进程也会破坏其他进程的运行 …

连号区间数c++

题目 输入样例1&#xff1a; 4 3 2 4 1输出样例1&#xff1a; 7输入样例2&#xff1a; 5 3 4 2 5 1输出样例2&#xff1a; 9样例解释 第一个用例中&#xff0c;有 77 个连号区间分别是&#xff1a;[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4][1,1],[1,2],[1,3],[1,4],[2,2…

详细讲解c语言结构体、联合体、枚举

目录 1、结构体类型声明 1.1结构体的定义 1.2 结构体变量的声明 1.3 结构体变量的创建和初始化 2、如何使创建的结构体所占内存最小 2.1 结构体内存对齐-存储 2.2 通过宏offsetof计算结构体内变量的偏移量 2.3 如何通过宏offsetof计算数组的偏移量 2.4 为什么存在内存对…

吴恩达机器学习笔记 二十四 决策树模型 学习过程 什么时候停止分裂 如何选择结点特征

案例&#xff1a;识别小猫&#xff0c;上面这个分类的特征 x 采用分类值&#xff08;几个离散的值&#xff09; 决策树最顶端的结点称根结点(root node)&#xff0c;除了根结点和叶子结点之外的叫决策结点(decision node)&#xff0c;最底层的叫叶子结点(leaf node)&#xff0c…

华为openEuler系统卸载jdk

华为openEuler系统卸载jdk 1.查看openEuler上已安装的 Java 版本&#xff1a; 在终端中运行以下命令&#xff0c;查看系统中已经安装的 Java 版本。 sudo alternatives --config java这将列出已安装的 Java 版本&#xff0c;你可以看到当前使用的是哪个版本 2.卸载 Java&am…

Python函数学习

Python函数学习 1.函数定义 在函数定义阶段只检查函数的语法问题 2.实参形参 ​​​​总结&#xff1a; &#xff08;1&#xff09;位置参数就是经常用的按照位置顺序给出实参的值&#xff1b; &#xff08;2&#xff09;关键字实参形式&#xff1a;key123&#xff1b;放在…

轻松打造完美原型:9款在线工具推荐

早年&#xff0c;UI设计师选择的工具有限&#xff0c;功能相对单一&#xff0c;大多数在线原型设计工具都是国外的&#xff0c;语言和网络都增加了设计工作的负担。如今&#xff0c;国内外有许多在线原型设计工具&#xff0c;不仅可以在浏览器上使用&#xff0c;而且还具有团队…

基于SpringBoot的后勤管理系统【附源码】

后勤管理系统开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myecli…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

Hybrid第二次雪梨作业

作业要求: 利用ReactNative和Axios完成以下效果。 注意: 1、RN不能直接引用svg图片,需使用第三方库,可将logo图片换成百度logo 2、搜索框可不要搜索图标 3、“全部”“精华”等前5项类型切换功能要实现(“客户端测试可不写”,接口没给出参数值),调用 https://cnodejs…