Nginx+tomcat集群+redis实现session共享

一,Session共享问题演示
1, 在tomcat中创建项目myweb(只放一个index.jsp的简单项目)
2, 分别启动两个tomcat,查看sessionid值
在这里插入图片描述
可以看到因为负载到的服务器不同,从而产生了不同的SessionId,这会产生一个非常不好的用户体验,用户看来请求的是同一个地址,且在之前已经把密码保存到session中了,然后再次请求,你后台代理到了其他的服务器,从而导致新产生session,用户还得重新输入账户,不得气疯。
二,Session共享问题解决
思想:将原来由每一个tomcat管理的session统一存储到redis中管理

版本: apache-tomcat-8.5.9、nginx-1.8.0、redis_2.8.9

github地址:https://github.com/mzd123/session_managerc 读者可以直接下载体验一下。

实现:

1、下载:对应jar包下载
在这里插入图片描述
2、解压之后。将jar包放入tomcat的lib中(注意是tomcat/lib中,不是我们自己项目的lib)
在这里插入图片描述
拷贝到两个tomcat的lib目录下面
在这里插入图片描述
3、配置解压之后的redis-data-cache.properties(根据你的redis配置吧,我的默认是本地6379端口)。配置完将这个文件放入tomcat/conf文件夹中。
在这里插入图片描述
4、配置tomcat/cong/context.xml,增加如下两行。
在这里插入图片描述
5、注意:因为tomcat-redis-session-manager这个版本的不同,classname会随着变化,2.0.4的版本是叫这两个。其实可以打开你下载的tomcat-cluster-redis-session-manager.jar看看他到底叫什么(不少小伙伴,本人第一次搞也是,网上代码一抄,发现tomcat启动就报类找不到。。。你classname都填错了,当然找不到了,能找到就奇怪了。。。)
在这里插入图片描述
最后,测试是否成功:
1、nginx配置(conf/nginx.conf):


```xml
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
   
    keepalive_timeout  65;
	
	# 反向代理配置
	upstream server_list{
	   # 这个是tomcat的访问路径
	   server localhost:8080;
	   server localhost:9999;
	}

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
			proxy_pass http://server_list;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
      
    }
}

2、准备两个tomcat,一个端口为8090,一个为9999

3、tomcat中jsp代码:新建 webapps\myweb\index.jsp

```html
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<%  
  request.getSession().setAttribute("mzd","123");
  SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
  String date=simpleDateFormat.format(new Date());
%>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>   
    <title>tomcat1</title>  
  </head>  
  <body>  
        SessionID:<%=session.getId()%>  
        <BR>  
        当前时间为:<%=date%>  
        <BR>  
        SessionPort:<%=request.getServerPort()%>  
        <BR>  
        mzd的值为:<%=session.getAttribute("mzd")%>  
       <BR>  
        <%  
        out.println("这是tomcat1");  
        %> 
  </body>  
</html>  



<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<%  
   SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
   String date=simpleDateFormat.format(new Date());
%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>   
      <title>tomcat2</title>  
  </head>  
  <body>  
        SessionID:<%=session.getId()%>  
        <BR>  
        当前时间为:<%=date%>  
        <BR>  
        SessionPort:<%=request.getServerPort()%>  
        <BR>  
        mzd的值为:<%=session.getAttribute("mzd")%>  
       <BR>  
        <%  
        out.println("这是tomcat2");  
        %> 
  </body>  
</html>  

4、启动两个tomcat和redis:如果不启动redis是会报错的。。。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值