要实现Tomcat的Session共享,有两种方式:一种是使用Session复制,一种是使用Session共享的方式。
- 使用Session复制实现Session共享
Session复制是一种将Session从一个Tomcat实例复制到另一个Tomcat实例的机制。这种机制中,在Tomcat集群中的每个节点上都有自己的Session副本。如果某个节点失效,则其他节点会接管Session。
使用Tomcat实现Session复制的步骤如下所示:
(1)配置好Tomcat集群,确保集群中的所有节点都可以互相访问。
(2)在每个节点的tomcat/conf下创建一个名为context.xml的文件,并配置如下:
<Context path="/" docBase="webapps/ROOT" debug="0" crossContext="true">
<!-- 配置Session复制器 -->
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
maxIdleBackup="0">
<Store className="org.apache.catalina.session.FileStore"
directory="/tmp/tomcat-sessions"/>
</Manager>
</Context>
上面的配置使用了PersistentManager,这个Session管理器将Session存储在硬盘上的文件中。在这种方式下,Session是可以跨多个Tomcat节点传输的。
(3)在tomcat/conf/server.xml文件中配置上面的context.xml:
<Engine name="Catalina" defaultHost="localhost">
<!-- 节点1 -->
<Host name="node1" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="ROOT" crossContext="true"/>
</Host>
<!-- 节点2 -->
<Host name="node2" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="ROOT" crossContext="true"/>
</Host>
</Engine>
这里配置了两个节点,分别为node1和node2。
(4)将Tomcat节点启动并加入到集群中。
注意:在启动每个Tomcat时需要通过-Dcatalina.home参数指定当前节点所在的目录,例如:
./bin/catalina.sh run -Dcatalina.home=/usr/local/tomcat1
./bin/catalina.sh run -Dcatalina.home=/usr/local/tomcat2
(5)最后,测试Session数据能否在Tomcat节点之间共享。
2.使用 Session 网络共享实现Session共享
除了Session复制之外,还可以使用Session网络共享的方式来实现Session共享。Session网络共享的机制是将Session存储在共享的存储区域中,提供给任何一个Tomcat节点访问。在Tomcat集群中,所有的Tomcat节点共享一个存储区域,在其中存储Session数据。
下面是使用Session网络共享来实现Session共享的步骤:
(1)在本地Tomcat节点的conf/context.xml文件中增加以下内容:
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true">
<Attribute name="mcastAddr">228.0.0.4</Attribute>
<Attribute name="mcastPort">45564</Attribute>
<Attribute name="mcastFrequency">500</Attribute>
<Attribute name="stopTimeout">250</Attribute>
<Attribute name="maxDirty" >5</Attribute>
<Attribute name="maxIdleBackup" >5</Attribute>
<Attribute name="clusteringMode" >true</Attribute>
<Attribute name="distributable" >true</Attribute>
</Manager>
上面的配置使用了DeltaManager,这是一种Session管理器,可以使用多个Tomcat节点共享Session。通过调整Attribute属性,可以设置各种DeltaManager细节参数,如:单播,多播,TCP/IP等。
(2)在Tomcat节点的server.xml文件中增加以下内容:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Manager className="org.apache.catalina.ha.session.DeltaManager" />
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000" />
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
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" />
<!-- Tomcat节点之间配置相互复制 -->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
</Channel>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
<Context className="org.apache.catalina.ha.context.ReplicatedContext"
crossContext="true"
docBase="/usr/local/tomcat/webapps/myapp"
path="/myapp"
reloadable="true"
useHttpOnly="true">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true" />
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
</Context>
</Cluster>
上面的配置中,定义了一个SimpleTcpCluster,以便让多个Tomcat节点组成一个集群。这里需要将节点之间的DeltaManager协调起来,使用MessageDispatch15Interceptor拦截器实现。这些参数可以通过调整channel的属性来更改。
(3)启动Tomcat节点并加入在集群中进行测试
到这里,Session共享的实现就完成了。可以测试在Tomcat节点之间是否可以共享数据,以及Session网络共享的表现如何。
示例代码:
// 获取session
HttpSession session = request.getSession();
// 给 session 中存储数据
session.setAttribute("username", "admin");
// 从 session 中获取数据
String username = (String) session.getAttribute("username");
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Tomcat实现session共享(session 会话复制) - Python技术站