很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题。session的统一管理有很多解决方案,比如存储至数据库、memcache、redis。那么我想给大家介绍的是将session存储至redis这个方案。
先要感谢开源项目 tomcat-redis-session-manager ,感谢作者
操作系统:windows 7 64位
Redis版本:Redis 2.8.2101(Redis安装方法这里不介绍了,请自行Google、Baidu)
Tomcat版本:tomcat7.0.64(2个tomcat实例,注意同一台机器上试的话,启动另一个tomcat实例的时候需要修改端口号,如果是不同机器上的tomcat,那就不用修改了)
JDK版本:jdk1.7.0_80(生产环境请使用servre版本)
请求监听端口 | Shutdown监听端口 | AJP监听端口 | |
tomcat_1 | 8080 | 8005 | 8009 |
tomcat_2 | 8090 | 8015 | 8019 |
tomcat_1端口按照默认配置(不改server.xml)
tomcat_2端口改为下面的配置(修改server.xml)
<Server port="8015" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> .... <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" /> .... </Service> </Server>
tomcat_1,tomcat_2都要修改contenxt.xml
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="localhost" port="6379" database="0" maxInactiveInterval="60" />
下载所需jar包(为了方便大家,我在附件里上传了所有的jar包)
1)redis的java客户端
https://github.com/xetorthio/jedis
2) tomcat-redis-session-manager的jar包,我用的是自己编译的(作者只给了gradle,⊙﹏⊙b汗没有maven的,我把它改成了maven工程的),见附件,源码也给到大家。
3) apache-commons-pool2
http://commons.apache.org/proper/commons-pool/download_pool.cgi
将下载好的jar包,放到tomcat_1/lib及tomcat_2/lib目录下,
首先开启redis服务 redis-server.exe redis.windows.conf
开启redis命令行客户端以便监视redis的状态变化,redis-cli -p 6379 monitor(如果有密码则 redis-cli -p 6379 -a mypass monitor)
分别通过catalina.bat run 开启tomcat_1,tomcat_2
在命令行终端,看到了如下信息,表明redis的session manager初始化成功
... 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Attached to RedisSessionHandlerValve 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer 信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Will expire sessions after 1800 seconds 十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory E:/WorkFolder/Temp/Redis-Session/apache-tomcat1-8080/webapps/manag 十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deploying web application directory E:/WorkFolder/Temp/Redis-Session/apache-tomcat1-8080/webapps/ROOT 十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.TldConfig execute 信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a co 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Attached to RedisSessionHandlerValve 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer 信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Will expire sessions after 1800 seconds ...
然后我们分别在tomcat_1/webapp/ROOT,tomcat_2/webapp/ROOT下放setsession.jsp,getsession.jsp
setsession.jsp内容:
<% session.setAttribute("name","jaychang"); session.setAttribute("id","1001"); %>
getsession.jsp内容:
<%=session.getAttribute("id")%> ID:<%=session.getAttribute("name")%> NAME:<%=session.getAttribute("id")%>
好了,至此,你应该也明白了,现在要干嘛了,那么重点来了,见证奇迹的时刻到了!
打开浏览器,输入 http://127.0.0.1:8080/setsession.jsp回车
D741CDC41F66331883AAB70DC6252046就是SESSIONID
值为
/xac/xed/x00/x05w/b/x00/x00/x01Pj/xc8/xf5/xb2sr/x00/x0ejava.lang.Long;/x8b/xe4/x90/xcc/x8f#/xdf/x02/x00/x01J/x00/x05valuexr/x00/x10java.lang.Number/x86/xac/x95/x1d/x0b/x94/xe0/x8b/x02/x00/x00xp/x00/x00/x01Pj/xc8/xf5/xb2sq/x00~/x00/x00/x00/x00/x01Pj/xc8/xf5/xb2sr/x00/x11java.lang.Integer/x12/xe2/xa0/xa4/xf7/x81/x878/x02/x00/x01I/x00/x05valuexq/x00~/x00/x01/x00/x00/a/bsr/x00/x11java.lang.Boolean/xcd r/x80/xd5/x9c/xfa/xee/x02/x00/x01Z/x00/x05valuexp/x01q/x00~/x00/asq/x00~/x00/x00/x00/x00/x01Pj/xc8/xf5/xb4t/x00 D741CDC41F66331883AAB70DC6252046sq/x00~/x00/x04/x00/x00/x00/x02t/x00/x04namet/x00/bjaychangt/x00/x02idt/x00/x041001
最后我们看到了...jaychang ...1001
好了,那我们再看看getsession.jsp,先看tomcat_1的getsession.jsp
看下redis变化,get "D741CDC41F66331883AAB70DC6252046"
再看看tomcat_2的getsession.jsp,页面上获取到了
再看看redis的变化,又一次get "D741CDC41F66331883AAB70DC6252046"
https://github.com/jcoleman/tomcat-redis-session-manager
https://support.pivotal.io/hc/en-us/articles/206085337-How-to-setup-Redis-Session-Manager-on-tcServer-Tomcat
http://www.cnblogs.com/lengfo/p/4260363.html