博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat多应用共享Session
阅读量:5935 次
发布时间:2019-06-19

本文共 9571 字,大约阅读时间需要 31 分钟。

  hot3.png

如何在一个tomcat下的几个web应用之间共享session

我们采取的是集中管理的办法。主要技术:

1.设置Context 的crossContext="true",使得各个web应用的servletcontext是可以互访的

       <Host name="localhost" appBase="webapps"

        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
<Context path="/SessionManager" reloadable="true" crossContext="true"></Context>
<Context path="/SessionManagerTest1" reloadable="true" crossContext="true"></Context>
<Context path="/SessionManagerTest2" reloadable="true" crossContext="true"></Context>

2.主动设置cookies,设置jsessionid为被共享的session的id,统一利用requestsessionid在指定的一个 servletcontext里的一个map查找对于的session,需要存取attribute都对取得的session操作

3.用监听器监听属性的失效

 

 

Tomcat集群之Session复制配置 分享

因为最近的项目要用到多web服务器实现访问负载和集群,负载调度使用的是LVS,而非apache的负载调度,因为在高访问量和大并发量的时候 LVS的性能比APACHE好。然后在web服务器上是使用tomcat5.5.25做应用服务器,对于tomcat的集群有两种方式,这个主要是针对 session而言的。一种就是sticky模式,即黏性会话模式;另外一种就是session复制模式了。所谓sticky模式就是说同一个用户的访问 请求都被派送到同一个tomcat实例上,这样我们就无须在多台服务器之间实现session共享了,这是其好处,不好的地方就是不能实现 failureover了,一但用户访问的机器挂掉,那么其session就会丢失。而session复制模式就可以很好的解决failureover的 问题,即使某一台web服务器挂掉了,用户的请求还会被负载到其他的web服务器上,而且session也被复制了,这样对用户而言就像是在同一台机器上 操作一样,不好的地方就是session复制需要系统资源和网络的开销,尤其是当web服务器多的时候或session里存储的数据量大的时候,这点将会 比较的明显(不过自己还没有做这方面的测试)。

针对这两种方式的弊端和好处,我们可以采用将两种方式结合的方式来达到更好的效果,那就 是sticky+session复制模式了。用户的请求按照 sticky方式被分发到同一个web服务器上,同时tomcat在后台做异步复制(非同步)session到其他web服务器,这样我们使用 sticky的简便性,同时又有了一定的容错能力。
下面我就将自己的tomcat集群配置经验跟大家分享一下,呵呵。现在想来,其实tomcat的集群配置真的是非常简单,几乎不需要改什么东西了。我今天就在windows上用一台机器来跑两个tomcat实例,下面是一些基础条件:
1.两个tomcat的目录分别为:d:\apache-tomcat-5.5.25-node1和d:\apache-tomcat-5.5.25-node2
2.在每个tomcat目录下的conf\Catalina\localhost目录下建立一个ROOT.xml文件,其内容为:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Context docBase="D:/mywebapps/test1"
3 privileged="true" antiResourceLocking="false" antiJARLocking="false" distributable="true">
4 </Context>
3.修改apache-tomcat-5.5.25-node1的connector端口为8091,修改apache-tomcat-5.5.25-node2的connector的端口为8092,这样是为了避免在同一机器上同时启动时造成访问端口冲突;
4.修改apache-tomcat-5.5.25-node2的Server端口为8006,与apache-tomcat-5.5.25-node1的Server端口8005不一样,也是避免两个tomcat实例启动时造成程序端口的冲突问题;
5.修改apache-tomcat-5.5.25-node2的AJP/1.3的端口为8019或其他非8009(默认)的端口,也是为了避免与apache-tomcat-5.5.25-node1的AJP/1.3端口冲突;
这 样,我们就可以保证每一个tomcat单独启动时都可以提供D:/mywebapps/test1的web服务,注意是单个启动哦,然后分别启动 apache-tomcat-5.5.25-node1和apache-tomcat-5.5.25-node2后,输入如下地址分别进行访问你的web 应用:
apache-tomcat-5.5.25-node1的访问地址:http://localhost:8091/你的页面地址
apache-tomcat-5.5.25-node2的访问地址:http://localhost:8092/你的页面地址
如果你的tomcat没能成功的提供服务,那么你就需要查看一下是否tomcat部署成功了。注意这里的D:/mywebapps/test1就是你的web应用的物理路径了,可以随意修改。下面就开始对server.xml文件的配置了。
找到apache-tomcat-5.5.25-node1目录下的server.xml文件,打开并找到配置Engine的位置,我们在最后加入 jvmRoute="node1",表示这个tomcat的实例名称为node1。修改前后的对比如下:
修改前:
<Engine name="Catalina" defaultHost="localhost">
修改后:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
然 后找到Cluster标签,并取消它的注释即可,无须做任何修改。同样,我们修改apache-tomcat-5.5.25-node2下的 server.xml文件,修改jvmRoute="node2",然后也是注释掉Cluster标签,注意,然后还要修改Cluster标签下的 Receiver标签的tcpListenPort端口号,我们改为4002(默认的是4001),这个是为了避免两个tomcat实例同时启动时造成冲 突。
通过上面的配置后,我们两个tomcat已经配置完毕,并且可以完成集群任务了。注意启动的时候不能直接双击其bing目录下的 startup.bat文件,我们还需要为每一个tomcat设置环境变量,分别在apache-tomcat-5.5.25-node1和 apache-tomcat- 5.5.25-node2的根目录下编写一个bat文件,内容如下:
apache-tomcat-5.5.25-node1目录下的startup_node1.bat内容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node1
bin/startup.bat
apache-tomcat-5.5.25-node2目录下的startup_node2.bat内容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node2
bin/startup.bat
然后分别运行这两批处理文件即可正常启动tomcat了。我们先启动node1,双击startup_node1.bat启动node1。我们可以在窗口的最上面看到如下的输出信息:
2008-1-4 19:12:24 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2008-1-4 19:12:25 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n
ame Catalina:type=ClusterSender,host=localhost
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket
信息: Setting cluster mcast soTimeout to 500
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastService start
信息: Sleeping for 2000 milliseconds to establish cluster membership
2008-1-4 19:12:27 org.apache.catalina.cluster.mcast.McastService registerMBean
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos
t)
2008-1-4 19:12:27 org.apache.catalina.cluster.deploy.FarmWarDeployer start
信息: Cluster FarmWarDeployer started.
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager...:
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Register manager to cluster element Host with name localhost
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager at
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager getAllCluster
Sessions
信息: Manager []: skipping state transfer. No members active in cluster group.
这表明我们的tomcat集群已经正常启动了。然后我们再运行apache-tomcat-5.5.25-node2目录下的startup_node2.bat以启动node2。然后我们可以可以在窗口的最上方看到如下的信息输出:
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n
ame Catalina:type=ClusterSender,host=localhost
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket
信息: Setting cluster mcast soTimeout to 500
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastService start
信息: Sleeping for 2000 milliseconds to establish cluster membership
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp
://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=245203]
2008-1-4 19:16:34 org.apache.catalina.cluster.mcast.McastService registerMBean
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos
t)
2008-1-4 19:16:34 org.apache.catalina.cluster.deploy.FarmWarDeployer start
信息: Cluster FarmWarDeployer started.
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager...:
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Register manager to cluster element Host with name localhost
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager at
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager getAllCluster
Sessions
警告: Manager [], requesting session state from org.apache.catalina.cluster.mcas
t.McastMember[tcp://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=248203
]. This operation will timeout if no session state has been received within 60 s
econds.
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager waitForSendAl
lSessions
请注意node2窗口输出的不同颜色部分,这个已经表示node2节点和node2节点联系上了。我们再回过来看node1窗口的输出信息,发现多出了如下的信息:
2008-1-4 19:16:34 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp
://192.168.1.227:4002,catalina,192.168.1.227,4002, alive=0]
这 表明node1也已经侦听到了node2,两个tomcat服务器已经建立了联系。然后我们访问node1的一个地址A,假设这个地址A往 session里设置一个属性,然后我们再在同一窗口中访问node2的一个地址B,假设B是从session里读取这个属性,我们会发现B地址确实得到 了这个刚刚我们在node1上设置进去的值。这里要特别注意的是,我们两个地址的分别访问必须是在同一个窗口中,因为我们没有做前端的web负载,所以使 用不同的窗口进行访问会出现不同的session(因为端口号不一样,也就导致访问地址不一样了),这样就导致无法查看的问题。

 

 

 

 

 

 

 

 

 

1. 新建两个应用:

test1

    |------WEB-INF

    |              |------web.xml

    |------test.jsp

test.jsp代码

1.<% 

2.    session.setAttribute("test1Session","test1Session");  3.    session.getServletContext().setAttribute("t1_session",session);  4.    out.println("Application /test1 is ok!<br>");  5.     
6.    if(session.getServletContext().getContext("/test2")!=null){  7.        HttpSession t2_session = (HttpSession)session.getServletContext().getContext("/test2").getAttribute("t2_session");  8.        if(t2_session!=null){  9.            String str = (String)t2_session.getAttribute("test2Session");  10.            String path = request.getContextPath(); 
11.            out.println("Application "+path +":"+str+"<br>");  12.        }else{  13.            out.println("Application /test2 no data!");  14.        } 
15.    } 
16.%> 
test2

    |------WEB-INF

    |              |------web.xml

    |------test.jsp

test.jsp代码

1.<% 

2.    session.setAttribute("test2Session","test2Session");  3.    session.getServletContext().setAttribute("t2_session",session);  4.    out.println("Application /test2 is ok!<br>");  5.     
6.    if(session.getServletContext().getContext("/test1")!=null){  7.        HttpSession t1_session = (HttpSession)session.getServletContext().getContext("/test1").getAttribute("t1_session");  8.        if(t1_session!=null){  9.            String str = (String)t1_session.getAttribute("test1Session");  10.            String path = request.getContextPath(); 
11.            out.println("Application "+path +":"+str+"<br>");  12.        }else{  13.            out.println("Application /test1 no data!");  14.        } 
15.    } 
16.%> 
2. 配置tomcat,设置crossContext = true,让两个应用可以在tomcat中交叉使用上下文环境。

<Context path="/test1" docBase="C:/test1" reloadable="true" crossContext="true"></Context>

<Context path="/test2" docBase="C:/test2" reloadable="true" crossContext="true"></Context>

3. 启动Tomcat,访问

页面输出:Application /test1 is ok!------------------------test1存储session成功

Application /test2 no data!--------------------test2还没有被访问,所以test2的session中没有数据

访问

页面输出:Application /test2 is ok!------------------------test2存储session成功

Application /test2:test1Session-------------test1Session来自test1应用中session

刷新

页面输出:Application /test1 is ok!------------------------test1存储session成功

Application /test1:test2Session-------------test2Session来自test2应用中session

应用test1和test2成功共享session,可以互相访问另一个应用中的session和session中的数据。

 

 

 

 

 

转载于:https://my.oschina.net/wpq/blog/130711

你可能感兴趣的文章
[转载] 民兵葛二蛋——第17集
查看>>
[转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
查看>>
【leetcode】75.Sort Colors
查看>>
2017-2018-1 20155332 《信息安全系统设计基础》课程总结
查看>>
strak组件(8):基本增删改查实现及应用和排序
查看>>
汕头市队赛 SRM 09 C 撕书
查看>>
Xcode常用快捷键
查看>>
如何快速有效的投诉上海移动
查看>>
python3爬虫-下载网易云音乐,评论
查看>>
【文文殿下】[BZOJ4008] [HNOI2015] 亚瑟王
查看>>
31.图片放大镜插件——jqzoom
查看>>
addSubview和insertSubview的区别
查看>>
js___原生js轮播
查看>>
堆排序—Java
查看>>
Linux内核驱动之GPIO子系统(一)GPIO的使用【转】
查看>>
Class create, device create, device create file【转】
查看>>
安装MySQL时,出现的1067问题详解
查看>>
软件工程个人日报 2016/7/4
查看>>
【Gamma】Scrum Meeting 6
查看>>
WindowsForm 增 删 查 改
查看>>