普通的项目部署,如果使用一台tomcat,那么就不存在什么session共享的问题了,如果后台部署了多个tomcat,那么多个tomcat之间需要考虑这个问题,session共享。默认tomcat的session信息是存储在本机的,所以多个tomcat,就造成了session有可能不一致的情况,如果不考虑session共享,那么,我们的页面有可能是这样的。
webapp/ROOT/session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<BR>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>
因为session存储在各自不同的目录下,我们在同一个浏览器中打开两个tab页面访问不同的tomcat,得到的就是两个服务的session不一样。
解决session共享的问题有很多,这里介绍如何使用memcache来做session管理。这里准备一个虚拟机,启动两个tomcat,端口分别为8080和8090,模拟多个tomcat部署的情况。
1、准备jar包:
kryo-3.0.3.jar
reflectasm-1.10.1.jar
minlog-1.3.0.jar
objenesis-2.1.jar
memcached-session-manager-tc8-2.1.1.jar
memcached-session-manager-2.1.1.jar
kryo-serializers-0.41.jar
protobuf-java-2.6.1.jar
msm-kryo-serializer-1.9.7.jar
spymemcached-2.11.1.jar
以上这些jar包均加入到tomcat/lib目录下。
2、多个tomcat均做相同的配置,配置tomcat/conf/server.xml配置文件的Context:
在server.xml配置文件的最后,增加一个Context的配置:
<Context docBase="ROOT" path="" reloadable="true" >
<Manager
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
sticky="false"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js|html|htm)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
配置截图:
3、启动memcache:
memcached -u root -p 11211 -d -m 64m
启动成功之后,会监听本机的11211端口。
4、启动多个tomcat:
再次验证session:
无论怎么刷新和切换tomcat,只要在一个浏览器中打开的tab页面,最终的session都是不会改变的。
这种和业务分开的session共享实现方式已经很少使用了,现在session管理都提到了业务代码里面,直接通过redis来管理session,而且登录之后,session和用户关联,如springboot+shiro+redis,它编码部署之后,直接使用内置的tomcat或者jetty启动,无需再考虑部署容器与session的关系了。