Tomacat集群环境下session对象如何实现共享

准备工作:四台虚拟机;一台安装nginx,两台安装Tomcat+JDK,一台安装redis

1、首先简单介绍一下session实现的底层原理

1.1 session是保存在服务器端,一次回话有效,关闭浏览器以及一定时间后失效;

1.2 底层原理:session底层是用cookie进行实现的;当浏览器第一次访问服务器,服务器会为该浏览器创建一个cookie对象(Cookie cookie = new Cookie(“JSESSIONID”,uuid))

并且返回给客户端保存到浏览器,同时服务器会创建一个session对象将客户信息保存到session对象中,并且底层操作map集合将发送到客户端的cookie对象的uuid作为键,session对象作为值存入map集合;

下次浏览器访问这台服务器会携带该Cookie对象,服务器接收到Cookie对象通过该cookie对象中的uuid在map集合中查找session对象;通过这个过程实现对session作用域的操作

session共享的原理 session共享redis原理_tomcat集群

2、Tomcat集群环境下操作session作用域暴露的问题

session共享的原理 session共享redis原理_tomcat集群_02


2.1 浏览器第一次访问某个应用,nginx(这里忽略ip黏着celue)会根据轮询的方式将请求发送到某台服务器上,该服务器会根据session的实现原理在该服务器上新建一个session对象

2.2 当浏览器又一次访问时,如果nginx将请求发送到另一台服务器,这时该服务器会根据浏览器携带的cookie进行查找,但是并没有找到;这个时候该服务器会另外新建一个session对象保存到该服务器上,并且这次访问响应回去的cookie会覆盖第一个访问的cookie;这时就会出现这样一个问题:明明是同一次回话,但是会出现服务器无法识别用户,也就是session对象无法实现共享

3、使用redis解决Tomcat集群环境下session对象无法实现共享的问题

3.1 安装redis

3.1.1 redis是C语言编写,需要安装gcc(C语言的编译工具)

yum install gcc

3.1.2 上传redis安装包(前提是要有)到/opt包下
3.1.3 解压

tar -zxvf redis.tar.gz

3.1.4 进入解压后的目录,执行 make 编译
3.1.5 修改 redis.conf 配置文件

vi redis.conf
在命令行状态输入  /appendonly    将appendonly no   修改为 appendonly yes

3.1.6 进入redis中的src目录

./redis-server  ../redis.conf

出现以下画面即为成功

session共享的原理 session共享redis原理_session共享的原理_03


3.1.7复制一个选项卡,进入redis中的src目录下

执行 ./redis-cli

:停止redis服务

1. ./redis-cli shutdown
2. ps-ef   然后查看redis服务的pid  kill-9 pid

3.2演示session不共享会出现的效果

3.1.1 搭建nginx、tomcat-1、tomcat-2以备测试

3.1.2 在两台tomcat中分别创建一个名字相同的项目demo(在tomcat中的webapps下)

3.1.3 将编写的login.jsp 和 index.jsp上传到demo项目中

session共享的原理 session共享redis原理_session共享的原理_04


session共享的原理 session共享redis原理_session共享_05

3.3 使用redis实现session共享

3.3.1 将下边三个jar包(没有自己想办法)上传到tomcat的lib目录(两台安装tomcat的虚拟机都要安装)

session共享的原理 session共享redis原理_服务器_06

3.3.2 修改tomcat中conf目录下的context.xml配置文件

修改host为redis数据库所在服务器的ip地址

session共享的原理 session共享redis原理_redis_07


3.3.3重启两台tomcat