很多时候我们支配运用会创造点击其他页面总要重新登录,这种一样平常是会话问题,系统访问的时候总是无法保持会话,本文紧张是通过配置tomcat集群来实现session共享!
1、配置tomcat8080和tomcat9090端口
修正tomcat9090配置文件server.xml
<Server port=\"大众9005\公众 shutdown=\"大众SHUTDOWN\"大众> <Connector port=\"大众9090\公众 protocol=\公众HTTP/1.1\"大众 connectionTimeout=\"大众20000\"大众 redirectPort=\公众8443\公众 /> <Connector port=\"大众9009\公众 protocol=\"大众AJP/1.3\"大众 redirectPort=\"大众8443\公众 />
2、设置tomcat集群
修正tomcat的配置文件,打开conf下的server.xml文件,找到下面这一行
<Engine name=\"大众Catalina\公众 defaultHost=\"大众localhost\公众>
不须要做任何修正,在这一行的下面加入如下代码:
<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\"大众 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\公众/> <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>
这个便是tomcat自带的集群配置了,在tomcat官方文档中的cluster-howto.html中看到干系把稳事变,个中有一条须要把稳一下:Make sure your web.xml has the <distributable/> element
很明显是说web项目的web.xml文件中须要有<distributable/>这个元素,以是在引入的web项目中做修正。
3、修正项目
在\tomcat\webapps\下新建testcluster文件夹,testcluster下新建index.jsp获取SessionID
<html><head><title>title</title><meta http-equiv=\"大众Content-Type\"大众content=\"大众text/html; charset=gb2312\"大众/> </head><body> SessionID:<%=session.getId()%> <BR> SessionIP:<%=request.getServerName()%> <BR> SessionPort:<%=request.getServerPort()%> <% out.println(\"大众This is Tomcat Server 8080\"大众); %> </body></html>
testcluster下建立WEB-INF文件夹,在WEB-INF下新建web.xml指向index.jsp和添加<distributable/>元素
<?xml version=\"大众1.0\"大众 encoding=\公众UTF-8\公众?><!-- PublicCMS利用Servlet3.0技能,Web.xml不再是全体工程的入口,config.initializer.Initializer为工程的入口类,config.Config为Spring配置 --><web-app xmlns:xsi=\公众http://www.w3.org/2001/XMLSchema-instance\"大众 xmlns=\公众http://java.sun.com/xml/ns/javaee\"大众 xsi:schemaLocation=\公众http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"大众 id=\"大众WebApp_ID\"大众 version=\公众3.0\公众> <display-name>elearning</display-name> <distributable/> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
把稳:由于\conf\content.xml配置了web.xml指向是要放在WEB-INF下,以是web.xml须要放在WEB-INF里面
D:\tomcat集群\tomcat8080\conf\content.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\"大众 /> --></Context>
4、启动tomcat并测试
启动tomcat:
D:\tomcat集群\tomcat8080\bin\startup.bat
D:\tomcat集群\tomcat9090\bin\startup.bat
测试地址:
http://localhost:8080/testcluster/index.jsp
http://localhost:9090/testcluster/index.jsp
每个浏览器会有不同的SessionID,但同个浏览器访问不同端口所获取的SessionID同等
附:tomcat集群配置参数
以上关于tomcat集群的配置只要在 <Engine> 节点 或者 <Host> 节点内部加高下面的代码即可支持集群化:
<Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\"大众/>
该配置将开启 all-to-all session 复制,并通过 DeltaManager 来复制 session 增量. 采取 all-to-all 办法意味着 session 会被复制到此集群中其他的所有节点. 对付很小的集群,这种办法很适用, 但我们不推举在较大的集群中利用(有很多 tomcat 节点的情形。例如,几十个节点及以上...). 其余,利用 delta 增量管理器时,纵然 某些节点没有支配运用程序,也会复制 session 到所有节点上.
要在较大的集群上进行session复制,须要利用 BackupManager. 此 manager 只复制 session 数据到一个备份节点, 并且只复制到支配了对应运用程序的那些节点. BackupManager的缺陷: 经由测试,性能不如 delta manager.
下面是一些主要的默认值:
1. 默认的 Multicast (组播)地址是: 228.0.0.4
2. 默认的 Multicast (组播)端口是: 45564 (端口号和地址组合往后就决定了 cluster 关系,被认为是同一个集群).
3. 默认广播的IP java.net.InetAddress.getLocalHost().getHostAddress() (确保你不是广播到 127.0.0.1, 这是一个常见的缺点)
4. 默认的监听复制的 TCP 端口是在 4000-4100 范围内第一个可用的server socket。
5. 配置了两个监听器: ClusterSessionListener 和 JvmRouteSessionIDBinderListener
6. 配置了两个拦截器: TcpFailureDetector 和 MessageDispatch15Interceptor
很多人都说写技能类的文章没人看,不管若何,分享出来最少自己也可以看~