我使用 Spring Boot 3.x 和外部 Tomcat 10。 在外部 Tomcat 上设置会话集群 如果我检查jsp页面,会话是共享的,但是 如果我使用 Spring Boot 服务检查相同的逻辑,则会话不会被共享。 如果我用jsp检查,它似乎是共享的,因此外部Tomcat之间的会话集群是不可能的。 看起来好像设置好了,但是为什么在Spring Boot中不能共享呢? SpringBootServletInitializer已经实现了。
我正在 Windows 上本地使用两个不同的 Tomcat 端口进行测试。 Distributable="true" 在 Context 中设置。
@GetMapping("/session-test")
public String sessionTest(HttpSession session, Model model) {
log.info("sessionTest enter ");
String sessionId = session.getId();
Integer counter = (Integer) session.getAttribute("counter");
if (counter == null) {
counter = 1;
} else {
counter++;
}
session.setAttribute("counter", counter);
model.addAttribute("sessionId", sessionId);
model.addAttribute("counter", counter);
return "web/sessionTest";
}
两个 Spring Boot 服务器希望共享它们的会话...
1 的服务器.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver
address="127.0.0.1"
port="3200"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"
className="org.apache.catalina.tribes.transport.nio.NioReceiver"/>
<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.TcpPingInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
host="127.0.0.1"
port="3201"
uniqueId="{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}"/>
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="ROOT" distributable="true"/>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
2 的server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver
address="127.0.0.1"
port="3201"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"
className="org.apache.catalina.tribes.transport.nio.NioReceiver"/>
<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.TcpPingInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
host="127.0.0.1"
port="3200"
uniqueId="{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17}"/>
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="ROOT" distributable="true"/>
我是这样处理的...... 我不知道为什么我必须这样做。
<Context>
<Manager className="org.apache.catalina.ha.session.DeltaManager"/>
</Context>