同一tomcat下session共享

最近在开发项目遇到需要多个项目共享session,在网上找了方法,实际测试发现有问题,下面将正确的方式写出来,供大家参考。
一般网络上能找到的好像都是从一个人的blog中copy的,都有相同的问题,让我们先来看看网上能找到的共享实现方式
有时我们会遇到一个大点的项目,为了方便实现有些功能,我们会把项目拆成不同的独立web项目。
但我们在管理这些项目时,只有一个登陆口,然后在其他项目取session来实现身份的验证。
--------------------------以下部分来自网络,是我筛选的认为写的比较明白的-------------------
1、配置tomcat下 conf/server.xml文件,在<Host></Hoser>配置如下:

 <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<!-- aa 和bb 为两个不同的web项目  -->
  <Context path="/aa"  reloadable="true" crossContext="true" />
  <Context path="/bb"  reloadable="true" crossContext="true"/>
</Host>

2、 在 aa项目存入session

 session.setAttribute("user",new Date().toString()+"weiqingli");
    ServletContext ContextA =session.getServletContext();
    ContextA.setAttribute("session", session);

3、在bb 项目取出 session

HttpSession session1 =request.getSession();
       ServletContext Context = session1.getServletContext();
       ServletContext Context1= Context.getContext("/aa");
        if(Context1 !=null && !Context1.equals("")){
            HttpSession sess =(HttpSession)Context1.getAttribute("session");
            out.println(sess.getAttribute("user"));
        }

大家可能很容易看得出这个是单向传的session,其实要实现双向,将上面的程序反写就可以实现从bb存入,aa取出了。

----------------------------网络截取部分完成--------------------------------

如果你在项目中真的这样用,你会发现,只有一个用户能登录,还有其他的一些问题。

正确的写法应该是这样的,首先tomcat的配置文件, crossContext="true"  这部分的含义是可以调用另外一个WEB应用程序 通过ServletContext.getContext() 获得ServletContext 然后再调用其getattribute() 得到你要的对象。只有这样是不够的,还需要加上 sessionCookiePath="/"  这部分的含义是 Session Cookie的位置在根目录“/”这样多个应用可以互相交互 。注意如果 sessionCookiePath="/" 你不这样写,很有可能你每次获得的sessionID都不一样。

然后我们看看来自网络部分其他的问题,关键在aa项目存入session的时候,有这样一句话

ContextA.setAttribute("session", session);

这句话就是每次都覆盖  "session" 这样在 ContextA 服务器中只有这样一个session 。如果你用session保存登录用户的话,那只能有一个人处于登录状态,就是最后登录的那个人。

下面给出正确的写法。

首先是tomcat配置部分:

<Host name="localhost"  appBase="f:/www"  unpackWARs="true" autoDeploy="true" crossContext="true">
  <Context path="/" docBase="" debug="0" reloadable="true" crossContext="true" sessionCookiePath="/" />
  <Context path="/testA" docBase="testA.war" debug="0" reloadable="true" crossContext="true" sessionCookiePath="/" />
  <Context path="/testB" docBase="testB.war" debug="0" reloadable="true" crossContext="true" sessionCookiePath="/" />

然后在testA项目里面存入session

session.setAttribute("user", "555=+++====||");
session.setAttribute("accountId", a);
ServletContext context = session.getServletContext();
context.setAttribute(session.getId(), session); // 注意这里,要传递sessionID过去

之后是在testB项目里面获得session

ServletContext Context = session.getServletContext().getContext("/testA");// 这里面传递的项目A的路径

if (Context == null) {
    return "testA Context is null ~!~!~!~!~!"+ "session.getId=" + session.getId();

    }
if (Context.getAttribute(session.getId()) == null) {
    return "no testA Context session get~!!!!!!!"+ "session.getId=" + session.getId();

    }
 HttpSession sessionUser = (HttpSession) Context.getAttribute(session.getId());

这样的话,项目testA存储的session在项目testB中就能够获得了,支持多用户。

时间: 2024-08-01 22:42:55

同一tomcat下session共享的相关文章

Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现

对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式: 一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据: 另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据. Tomcat集群session同步方案有以下几种方式: 1)使用tomcat自带的

CentOS7 下 Nginx + Tomcat 实现 Session 共享

在之情的文章中搭建的 centos7 + tomcat + nginx 的环境的基础上, 使用 redis 实现 tomcat 的 session 共享的问题. 一 : 安装 Redis 安装 gcc: yum install -y gcc-c++ 使用 FTP 服务器上传安装包,解压上传的 redis 的包 tar -zxvf redis-3.0.0.tar.gz 进入解压目录 redis-3.0.0 执行 make PREFIX=/usr/local/redis install 把 redi

N个tomcat实现Session共享

集群之后比如我们有N个Tomcat,用户在访问我们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会导致怎样的后果,所以我们需要解决一下多个tomcat之间session共享的问题. 修改index.jsp SessionID:<%=session.getId()%> SessionIP:<%=request.getServerName()%> SessionPort:<%=requ

Nginx + tomcat + Memcached(session共享)

Nginx + tomcat + Memcached(session共享) 实验拓扑 nginx   实现负载 tomcat   实现web功能 memcached 实现会话共享 安装Nginx [[email protected] ~]# yum -y install pcre pcre-devel [[email protected] ~]# tar -zxvf nginx-1.0.5.tar.gz [[email protected] ~]# cd nginx-1.0.5 [[email 

生产-tomcat的session共享方案

生产-tomcat的session共享方案 在部署nginx+tomcat集群后,nginx采用负载均衡轮训模式,会出现访问时每个tomcat应用都会互相覆盖sessionID,导致sessionID不断变化,从而导致java一些功能实现不正常.作者查阅了不少文档,并且在测试环境和预生产环境进行各类测试,有两种方法可行. 应为目的只是实现session共享,杜绝session不断变化,所以解决方案越简单越好,本文属于实践文档,不会过多涉及原理和技术方面的东东,谷歌有详细相关技术介绍. 1    

【电商】nginx+redis+tomcat实现session共享集群

本文记录nginx+redis+tomcat实现session共享的过程 tomcat-redis-session-manager组件:https://github.com/jcoleman/tomcat-redis-session-manager tomcat-redis-sessoin-manager对tomcat的支持: (1) tomcat6:支持,要求jdk为1.6, 需要引入tomcat-redis-session-manager-1.2-tomcat-6.jar,不过现在已经处理不

高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享

一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d 2> 使用telnet测试memcached服务 3> 对memcached进行增.删.改.查等操作 方案: 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5). 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测

构建memcached服务,Tomcat实现session共享

构建memcached服务 1.1 问题 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 安装memcached软件,并启动服务 使用telnet测试memcached服务 对memcached进行增.删.改.查等操作 1.2 方案 使用1台RHEL7虚拟机作为memcached服务器(192.168.4.5). 在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测试时需要提前安装te

tomcat 在linux下 session共享问题

之前在 windows上使用tomcat session共享是OK的 在windowns上只是更改了tomcat/conf/server.xml 中一小部分. 现在转到 Linux上后 同样更改后不可用. LifecycleException:  org.apache.catalina.tribes.ChannelException: java.lang.IllegalArgumentException: java.net.UnknownHostException: auto; No fault