session问题解决方法

👨‍💻个人主页: 才疏学浅的木子

🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️

📒 本文来自专栏: 常用工具类以及常见问题处理方法

🌈 每日一语:越努力越幸运 🌈

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"/>

1、将上面的复制到两个tomcat的server.xml配置文件中

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" %>

</p> <p>tomcat2</p> <p>

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" %>

</p> <p>tomcat2</p> <p>

<%

session.setAttribute("session","libo");

%>

<%

out.println("this is set SessionValue success");

%>

代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>

</p> <p>tomcat2</p> <p>

<%

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更快

缺点

需要编写代码