同一个tomcat不同项目的session共享问题(三)

需要准备的软件:

apache-tomcat-7.0.79

Redis服务器

tomcat-redis-session-manager-1.2.jar

jedis-2.5.2.jar

commons-pool2-2.0.jar

这个tomcat-redis-session-manager版本暂时只支持tomcat7.0。支持8.0的下一篇再讲。

准备的测试程序:

a.war。重新命名一个b,都放到webapps下。

3个jar包都放到tomcat的lib下。

需要修改的配置:

修改两tomcat的context.xml:

<Context>  
  
    <!-- Default set of monitored resources -->  
    <WatchedResource>WEB-INF/web.xml</WatchedResource>  
  
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->  
    <!-- 
    <Manager pathname="" /> 
    -->  
  
    <!-- Uncomment this to enable Comet connection tacking (provides events  
         on session expiration as well as webapp lifecycle) -->  
    <!-- 
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> 
    -->  
  
  <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
  <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
   host="localhost"  
   port="6379"  
   database="0"  
   maxInactiveInterval="60" />  
</Context>

这里的host是指redis的服务器所在ip

启动redis服务


网上说这样已经能看到效果了。但我自己试了不知道,为什么哪里有问题。为此我还改了一个地方:

tomcat 的 server.xml,找到 Host 节点,加入配置

<Context path="/a"  debug="9" reloadable="true" sessionCookiePath="/" />  
<Context path="/b"  debug="9" reloadable="true" sessionCookiePath="/" />

这个是为了让2个程序共享一个sessionid。然后再重新启动tomcat就可以了。


a.war.zip

下载之后去掉.zip就行。

同一个tomcat不同项目的session共享问题(二)

问题描述: 
session常常用来存储一些公共信息供不同页面访问,比如用户登录信息。访问同一个tomcat下的不同项目所创建的session是不一样的。自然地面临了如何共享session的问题。

解决思路: 
解决数据共享问题的思路无非两种 
1、找个公共的地方存放共享的数据 
2、不同数据源之间做数据同步

解决方案: 
1、修改tomcat的server.xml文件 
每一个web应用程序都有唯一一个ServletContext实例对象,被该web应用下面的每一个servlet共享。通过修改tomcat的server.xml,使不同web应用的ServletContext可以互相访问。然后,用ServletContext的setAttribute()方法把session存入ServletContext中,在另一个web程序就可以用getAttribute()方法取得传递过来的session。

server.xml文件修改如下:

<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">
    <Context path="/WebappA"  debug="9" reloadable="true" crossContext="true"/> //WebappA为项目名,crossContext="true"是关键    
    <Context path="/WebappB"  debug="9" reloadable="true" crossContext="true"/>
</Host>

crossContext属性的意思是:如果设置为true,你可以通过ServletContext.getContext() 调用另外一个WEB应用程序,获得ServletContext 然后再调用其getAttribute() 得到你要的对象。

Java代码如下:

WebappA:

HttpSession session = request.getSession();
session.setAttribute("userId", "test");
ServletContext ContextA =session .getServletContext();
ContextA.setAttribute("session", session );

WebappB:

HttpSession sessionB = request.getSession();  
ServletContext ContextB = sessionB.getServletContext();  
ServletContext ContextA= ContextB.getContext("/WebappA");// 这里面传递的是 WebappA的虚拟路径
HttpSession sessionA =(HttpSession)ContextA.getAttribute("session");
System.out.println("userId: "+sessionA.getAttribute("userId"));

tomcat 集群配置,Session复制共享(一)

tomcat不同服务器之间session共享是分布式环境必须的课题。

同步方案有许多种,这篇先来说说tomcat自带的方法

本配置在tomcat7上验证通过。通过此方法配置的集群,session信息将会被自动复制到各个节点。

官方文档:

http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html

1、配置Server.xml

在Server.xml中,找到被注释<Cluster/>节点,修改为如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1"
address="228.0.0.4"<!--保留ip,用于广播-->
port="45564"
frequency="500"
dropTime="3000"/> 
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4001"<!--如果是在同一台机器上的两个tomcat做负载,则此端口则不能重复-->
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

2、修改web.xml

在web.xml中,标志为 <distributable/>

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> 
<display-name>session</display-name> 
<distributable/> 
</web-app>