Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享

前言

【可跳过,比较简单】

  1. 由于以前的项目配置了多个tomcat服务使用了nginx代理,但是关闭某个tomcat的时候登录用户信息丢失,用户得重新登录,这就让人体验不好了;
  2. 我们可以复制各个tomcat服务的session来实现的session共享,但是单单tomcat之间共享就会产生许多问题,比如:tomcat的数量多时session之间的共享也对性能有消耗,会有一定的延迟;当用户很多时,每台机器用于保存Session数据的内容占用会很严重。
  3. 所以我们可以将session的数据放到redis中,让所有tomcat去连接redis实现共享。

实现

准备

使用到的服务和中间件如下
版本:tomcat8.0.53、Redis-x64-3.2.100、nginx-1.18.0、tomcat-cluster-redis-session-manager-2.0.4
下载

  1. tomcat 下载:https://archive.apache.org/dist/tomcat/tomcat-8/
  2. nginx下载:http://nginx.org/en/download.html
  3. tomcat-redis-session-manager
    GitHub下载1:https://github.com/mzd123/session_manager
    GitHub下载2:https://github.com/ran-jit/tomcat-cluster-redis-session-manager/wiki
    网盘下载:https://pan.baidu.com/s/1un2_noV4VOonczUcpEUUJQ 提取码: jxgv
  4. 准备两个tomcat
  5. tomcat我分别改成端口8080、8081
  6. 安装redis
  7. 解压安装nginx
  8. 解压tomcat-redis-session-manager

步骤

第一步

解压tomcat-redis-session-manager后,将lib下的jar包复制到“tomcat下的lib包下”

Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第1张图片

第二步

将redis-data-cache.properties复制到两个tomcat的conf目录下
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第2张图片

并修改文件,将redis连接配置填充
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第3张图片

第三步

编辑tomcat下面的context.xml,添加两行代码
className会根据tomcat-cluster-redis-session-manager-2.0.4.jar的版本变动,使用class反编译可看到

	
	<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
	<Manager className="tomcat.request.session.redis.SessionManager" />

如下
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第4张图片
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第5张图片
反编译tomcat-redis-session-manager.jar可以看到文件路径名称这些,对应上面引入
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第6张图片

第四步

修改nginx的conf下的nginx.conf配置文件(只是本地测试不用nginx也可测试)
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第7张图片

第五步

tomcat下的jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	session.setAttribute("mzd", "123");
%>

DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>

		<title>testtitle>

		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">

<style type="text/css">
body {
	margin: 0px;
	padding: 0px;
	overflow: hidden;
}

.bg{
	width: 100%;
    height: 50%;
    background: #78cd77;
    position: absolute;
	text-align: center;
}
style>

head>
	<body style="background: white;">

		<div class="bg">
			<br>
			<br>
			SessionID:<%=session.getId()%>  
			<br>
			<br>
			mzd的值为:<%=session.getAttribute("mzd")%>  
			<br>
			<br> 
			tomcat2
		div>
		
	body>
html>

第六步

1、启动redis。
2、启动两个Tomcat【启动时注意端口是否被占用而报错】。
3、启动nginx。(只启动两个Tomcat也可以测试出效果)
4、打开网页测试输入:http://localhost:8080/ 和 http://localhost:8081/

效果

同浏览器不断刷新测试

nginx转发tomcat1后
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第8张图片
nginx转发tomcat2后
Tomcat8.0使用tomcat-redis-session-manager共享session【开源】,tomcat实现session共享_第9张图片

更多方式参考:https://blog.csdn.net/tuesdayma/article/details/81387862

问题

存储session中的对象必须序列化,如果序列化的对象内有对象也是如此。

你可能感兴趣的:(Tomcat8,Nginx,redis,tomcat,redis,开源,session共享)