一、工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案:

  1、使用数据库来存储Session

  2、使用Cookie来存储Session

  3、使用Redis来存储Sesssion

  4、使用Tomcat的session复制

  5、使用Memcached来存储Session

二、本文中主要讲一下第3种方案,也就是使用Redis来存储Session,Github中已经有该开源组件(Tomcat-redis-session-manager),下面讲一下配置的步骤:

  1、环境准备

    Tomcat7 下载地址:http://tomcat.apache.org/download-70.cgi

    Tomcat-redis-session-manager 下载地址:http://pan.baidu.com/s/1bokMOVH

    本文使用的Nginx来做的Tomcat集群。

Nginx安装参考:Linux Centos 6.5_x86安装Nginx

    Redis安装参考:转:Centos6.5_x86安装Redis

  2、配置tomcat配置文件context.xml

   <!-- host="192.168.159.129"       Redis地址 -->
<!-- port="6379" Redis端口 -->
<!-- password="123456" Redis密码 -->
<!-- database="0" 存储Session的Redis库编号 -->
<!-- maxInactiveInterval="60" Session失效的间隔(秒) --> <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.159.129"
port="6379"
password="123456"
database="0"
maxInactiveInterval="60" />

  注:

  1)Manager节点中的className属性为必选项,其它均为可选项

  2)maxInactiveInterval设置不生效,暂时找不到原因,在部署中发现Session失效的间隔一直都是读取tomcat/conf/web.xml中的session-config节点中配置的session-timeout属性值,且都是以秒为单位,(这个地方maxInactiveInterval好像不起作用,和web.xml中配置的session-config优先级有关?)

  3、添加Tomcat-redis-session-manager的jar包到tomcat/lib目录下,需要的jar包如下:

    commons-pool2-2.2.jar
    jedis-2.5.2.jar
    tomcat-redis-session-manage-tomcat7.jar

3、在nginx中配置负载均衡,配置文件为nginx.conf

  http {
   upstream myServer {
    server 192.168.1.2:8080;
  server 192.168.1.3:8080;
   }
  server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass http://myServer;
   }
}
}

  配置完后,访问localhost的请求都将被转发到192.168.1.2:8080以及192.168.1.3:8080中去,可以在Jsp页面中打印一下Session Id验证一下:

  Session Id : <%= request.getSession().getId() %>

  如果在同一个浏览器页面上不断刷新访问,SessionId的值不变化的话,说明配置正确,此时获取的是同一个Session对象。

   也可以通过redis客户端连接到Redis库中直接查看:查看会显示有 “56E2FAE376A47F1C0961D722326B8423” key的 session 数据,value为序列化数据。

  

  注:

  1)GitHub中该开源组件(Tomcat-redis-session-manager)的主页:https://github.com/jcoleman/tomcat-redis-session-manager

  2)该组件目前不支持Tomcat8,我用的是Tomcat 7.0.68版本

  3)在程序中将对象放到Redis里时,该对象必须实现java.io.Serializable接口,否则将报错,如果对象中有其它对象的引用,该引用对象也需实现java.io.Serializable接口,所以在使用request.getSession().setAttribute()方法时,一定要注意一下这一个细节。

  4)因为要把Tomcat-redis-session-manager的jar包放到Tomcat/lib中,对Tomcat的部署造成了侵入,可以使用Spring Session来替代,spring-session使用拦截器重新包装了request从而替换session实现

  5)因为所有集群的Tomcat中配置的Redis地址是一个,如果Redis崩溃了,那么Session就不可用了,所以需要部署Redis集群,实现故障自动切换,高可用的目标。

  keepalived+redis 高可用redis主从解决方案

文章参考自:

    1.https://my.oschina.net/kolbe/blog/618167

    2.http://www.cnblogs.com/lengfo/p/4260363.html

    

使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享的更多相关文章

  1. 使用Tomcat+Redis来实现集群部署中的Session共享问题

    一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储Session 2.使用Cookie来存储Session 3.使用Redis ...

  2. NAT集群部署solo之session server

    author:JevonWei 版权声明:原创作品 使用Nginx做代理服务器,部署solo,使用session server做会话黏滞 拓扑图 环境 tomcatA 172.16.253.108 t ...

  3. nginx+php负载均衡集群环境中的session共享方案梳理

    在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

  4. Redis的安装配置及简单集群部署

    最近针对中铁一局项目,跟事业部讨论之后需要我们的KF平台能够接入一些开源的数据库,于是这两天研究了一下Redis的原理. 1. Redis的数据存储原理及简述 1.1Redis简述 Redis是一个基 ...

  5. Nginx+Tomcat+Memcached 实现集群部署时Session共享

    Nginx+Tomcat+Memcached 实现集群部署时Session共享 一.简介 我们系统经常要保存用户登录信息,有Cookie和Session机制,Cookie客户端保存用户信息,Sessi ...

  6. Apache+Tomcat +mod_proxy集群负载均衡及session

      序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...

  7. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

  8. Nginx+Tomcat集群部署

    为了获取更好的性能,我们常常需要将tomcat进行集群部署.下文通过nginx转发实现tomcat集群,并通过nginx-upstream-jvm-route插件保证session的粘滞. 应用场景环 ...

  9. Nginx + Tomcat 在 Windows7 上搭建负载均衡集群

    一.安装Tomcat和Nginx 首先安装两个apache-tomcat-8.0.41,下载地址:http://tomcat.apache.org 并安装一个nginx-1.13.0,下载地址http ...

随机推荐

  1. CognitiveJ一个Java的人脸图像识别开源分析库

    CognitiveJ 是一个开源的,支持 Java 8 API 的库,用于管理和编排 Java 应用和微软的Cognitive(Project Oxford)机器学习和图像处理库的项目,可以让你查询以 ...

  2. block、块级作用域

    block:语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 包含在{ }里面 通常在流程控制语句 (如 if, for, while)中使用 块级作用域:通过var声明的变量没有块级作 ...

  3. 如何把phpStorm打造成自己的专属IDE

    1.如何设置phpStorm的默认编码,例如UTF-8?phpStorm的编码分为IDE Encoding 和Project Encoding,设置方法是打开File->Setting-> ...

  4. Unix环境编程基础下

    Unix出错处理 当UNIX系统的函数出错时,通常会返回一个负值.我们判断函数的返回值小于0表示出错了,注意我们并不知道为什么出错.例如我们open一个文件,返回值-1表示打开失败,但是为什么打开失败 ...

  5. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化

    老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...

  6. JavaScript原生Array常用方法

    JavaScript原生Array常用方法 在入门Vue时, 列表渲染一节中提到数组的变异方法, 其中包括push(), pop(), shift(), unshift(), splice(), so ...

  7. C#设计模式:责任链模式

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

  8. Entity Framework技术系列之0:开篇

    小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...

  9. 跟着刚哥梳理java知识点——多线程(十六)

    创建多线程第一种方式:① 继承:继承Thread.② 重写:重写Thread类的run()方法③ 创建:创建一个子类的对象④ 调用:调用线程的start()方法,启动此线程,调用run()方法 cla ...

  10. 简单介绍关于IOS的生命周期过程

    初步了解一下生命周期的过程: 1.通过alloc init 分配内存,初始化controller. 2.loadViewloadView方法默认实现[super loadView]如果在初始化cont ...