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作用域的操作
2、Tomcat集群环境下操作session作用域暴露的问题
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
出现以下画面即为成功
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项目中
3.3 使用redis实现session共享
3.3.1 将下边三个jar包(没有自己想办法)上传到tomcat的lib目录(两台安装tomcat的虚拟机都要安装)
3.3.2 修改tomcat中conf目录下的context.xml配置文件
修改host为redis数据库所在服务器的ip地址
3.3.3重启两台tomcat