Sometimes when you want to create large portal-like application which consists of a few smaller applications, or you want to create your own SSO domain, you must share session and session data between all interested applications.
Today I will show you how you can share session and data across applications in Apache Tomcat 6.
Enabling session sharing
Open $CATALINA_HOME/conf/server.xml, find the 8080 connector definition:
view sourceprint?1.<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />and simply add emptySessionPath="true" attribute to it so that it looks something like this:
view sourceprint?1.<Connector port="8080" protocol="HTTP/1.1" emptySessionPath="true" connectionTimeout="20000" redirectPort="8443" />Test projects
I created two simple applications called session1 and session2.
session1 increments the counter:
view sourceprint?01.<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
02.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
03.<html>
04.<head>
05.<title>++</title>
06.</head>
07.<body>
08.<h1>I'm incrementing the counter!</h1>
09.<c:set var="counter" value="${sessionScope.counter + 1}" scope="session" />
10.<h1>Current counter value is ${sessionScope.counter}</h1>
11.</body>
12.</html>session2 decrements the counter:
view sourceprint?01.<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
02.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
03.<html>
04.<head>
05.<title>--</title>
06.</head>
07.<body>
08.<h1>I'm decrementing the counter!</h1>
09.<c:set var="counter" value="${sessionScope.counter - 1}" scope="session" />
10.<h1>Current counter value is ${sessionScope.counter}</h1>
11.</body>
12.</html>Deploying and testing
When I deployed both applications and refreshed a few times their index pages:
view sourceprint?1.http://localhost:8080/session1/
2.http://localhost:8080/session2/although the JSESSIONID cookie was the same:
counters were independent. The first one showed +4, the second one showed -4.
The problem and the solution
Problem: even though the session id is the same in both applications you cannot share data directly using HttpSession object.
Solution: you have to use session-aware cross contexts in order to share data between applications.
Cross contexts in Apache Tomcat
First you have to allow applications to access each others' contexts.
Open $CATALINA_HOME/conf/context.xml and add crossContext="true" attribute to the <Context /> root element:
view sourceprint?1.<?xml version='1.0' encoding='utf-8'?>
2.<Context crossContext="true">
3.<WatchedResource>WEB-INF/web.xml</WatchedResource>
4.<Manager pathname="" />
5.</Context>Re-start the server.
Cross context data sharing
Please note that I highly loath scriptlets, I only show them in order to simplify the listing
Edit index.jsp of the session1 application so that it looks like this:
view sourceprint?01.<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
02.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
03.<html>
04.<head>
05.<title>++</title>
06.</head>
07.<body>
08.<%
09.ServletContext siblingContext = request.getSession().getServletContext().getContext("/session1");
10.Integer counter = (Integer)siblingContext.getAttribute("counter");
11.if (counter == null) {
12.counter = 0;
13.}
14.counter++;
15.request.setAttribute("counter", counter);
16.siblingContext.setAttribute("counter", counter);
17.%>
18.<h1>I'm incrementing counter!</h1>
19.<h1>Current counter value is ${counter}!</h1>
20.</body>
21.</html>Then, modify the session2 application:
view sourceprint?01.<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
02.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
03.<html>
04.<head>
05.<title>--</title>
06.</head>
07.<body>
08.<%
09.ServletContext siblingContext = request.getSession().getServletContext().getContext("/session1");
10.Integer counter = (Integer)siblingContext.getAttribute("counter");
11.if (counter == null) {
12.counter = 0;
13.}
14.counter--;
15.request.setAttribute("counter", counter);
16.siblingContext.setAttribute("counter", counter);
17.%>
18.<h1>I'm decrementing counter!</h1>
19.<h1>Current counter value is ${counter}!</h1>
20.</body>
21.</html>Re-deploy both applications.
Now, when you access both applications, you will see that the counter is now shared.
Session-aware cross context data sharing
Didn't you spot anything weird?
I'm sharing data using ServletContext. Its scope is the application scope, not the session scope.
If you open both pages in different browsers you will see that the counter shares its value.
How to make it session-aware?
Since JSESSIONID is the same, you can create a map and use session id as a key to store session data and then store the map in ServletContext like this:
view sourceprint?1.Map<String, Object> data = new HashMap<String, Object>();
2.String id = request.getSession().getId();
3.data.put(id, counter);
4.siblingContext.setAttribute("data", data);
URL: http://jee-bpel-soa.blogspot.com/2009/06/session-sharing-in-apache-tomcat.html
分享到:
相关推荐
3集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个...欢迎下载:Apache Tomcat负载均衡及Session绑定的实现.doc,共10页,3千多字,图文教程!
tomcat修改sessionId,同一台服务器部署多个tomcat需要修改sessionId,否则会出现session冲突的问题
tomcat-redis-session-manager-tomcat-7 Redis-backed non-sticky session store for Apache Tomcat
NULL 博文链接:https://xueweiabcok.iteye.com/blog/1841448
因tomcat7使用redis共享session,其他的包存在问题,自己编译后处理通过。 该包是在https://github.com/jcoleman/tomcat-redis-session-manager 将源码编译后的包。
文件名写错了,此压缩文件支持tomcat8.5。是否支持8.0请自行测试,本人只测试了8.5,可以使用。压缩文件包括tomcat-redis-session-manager-...apache-tomcat-8.5.33.tar.gz,nginx-1.6.2.tar.gz也打包进去,一步到位。
Tomcat做集群的时候需要需要session同步,支持Tomcat8。内含kuanrf-tomcat-redis-session-manager-1.0.jar、jedis-2.7.2.jar、commons-pool2-2.4.1.jar、tomcat-juli-8.0.23.jar,导入到tomcat包下。 适合于 tomcat ...
在Apache Tomcat 7设置redis作为session store redis已经有组件支持直接在tomcat7中设置下将redis作为tomcat默认的session存储器,下面介绍下配置过程 1.从http://redis.io/下载redis,按照redis服务端 wget ...
修复了redis-session-manager-tomcat6包存入null值的session时报空指针问题。
nignx 进行负载后session失效的完美解决,亲测可用
Apache,tomcat负载均衡和session复制
nginx+tomcat8+memcached session共享所需jar包 直接放到tomcat/lib下即可
傻瓜式的描述怎么实现在一台windows机器上怎么实现Apache2.2+Tomcat6.0的负载均衡和session复制,不用动脑子的,因为我自己在配置过程中由于某些设置有问题,死活不成功,被折磨了很久,所以把分析过程写下来,如果...
Tomcat8亲测可用 tomcat-redis-session-manager的jar包 修改了tomcat-redis-session-manager源码进行的编译生成的jar包
设定tomcat中session过期时间的三种方式
Tomcat和Apache集群和负载均衡配置 Tomcat版本:apache-tomcat-7.0.26 Apache版本:Apache2.2.25 jre版本:1.6.0_26 集群和负载均衡配置已整好,解压后,只要点击run.bat一键启动,即可看到集群效果。 运行成功后,...
使用SpringSession管理多台tomcat的session同步到redis上
无意间看到tomcat 6集群的内容,就尝试配置了一下...环境:PC2台:pc1(IP 192.168.88.118)安装了apache和tomcat pc2(IP 192.168.88.168)安装了tomcat 系统 win xp sp3 http://jackandroid.javaeye.com/blog/627147
完美实现分布式集群Session共享 简单多tomcat8+redis的session共享实现,支持tomcat8、tomcat8.5、tomcat9,不能用直接联系我积分双倍返回。
tomcat 集群 nginx 使用redis 保证session同步