👨💻个人主页: 才疏学浅的木子
🙇♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇♂️
📒 本文来自专栏: 常用工具类以及常见问题处理方法
🌈 每日一语:越努力越幸运 🌈
session共享问题及解决方案tomcat的安装与配置tomcat的安装tomcat集群的配置session问题解决方法前端存储原理优缺点session的复制操作步骤原理优缺点session粘性操作步骤原理优缺点后端存储(Mysql、Redis等)操作步骤原理优缺点tomcat的安装与配置tomcat的安装官网下载
Apache Tomcat官网
我下载的版本为8.5.82
解压两份
tomcat集群的配置官网提供的配置
官网配置地址
我的配置步骤
代码语言:javascript复制 channelSendOptions="8"> expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> filter=""/> tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/>
2、改端口
为啥改端口:因为我只有一台电脑
只要不与tomcat1相同就行
3、在tomcat1和tomcat2中的webapps\ROOT目录下删除页面然后加上这三个页面
第一个是index,第二个是login,第三个是logout
index是首页,login是设置session,logout是删除session
把tomcat2改为tomcat1然后继续复制
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
tomcat2
SessionID:<%=session.getId()%>
SessionValue:<%=session.getAttribute("session")%>
SessionIP:<%=request.getServerName()%>
SessionPort:<%=request.getServerPort()%>
<%
out.println("this is tomcat 2");
%>
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
tomcat2
<%
session.setAttribute("session","libo");
%>
<%
out.println("this is set SessionValue success");
%>
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
tomcat2
<%
session.removeAttribute("session");
%>
<%
out.println("this is remove SessionValue success");
%>
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更快
缺点
需要编写代码