问题描述: 
session常常用来存储一些公共信息供不同页面访问,比如用户登录信息。访问同一个tomcat下的不同项目所创建的session是不一样的。自然地面临了如何共享session的问题。

解决思路: 
解决数据共享问题的思路无非两种 
1、找个公共的地方存放共享的数据 
2、不同数据源之间做数据同步

解决方案: 
1、修改tomcat的server.xml文件 
每一个web应用程序都有唯一一个ServletContext实例对象,被该web应用下面的每一个servlet共享。通过修改tomcat的server.xml,使不同web应用的ServletContext可以互相访问。然后,用ServletContext的setAttribute()方法把session存入ServletContext中,在另一个web程序就可以用getAttribute()方法取得传递过来的session。

server.xml文件修改如下:

 <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">
<Context path="/WebappA" debug="9" reloadable="true" crossContext="true"/> //WebappA为项目名,crossContext="true"是关键
<Context path="/WebappB" debug="9" reloadable="true" crossContext="true"/>
</Host>

crossContext属性的意思是:如果设置为true,你可以通过ServletContext.getContext() 调用另外一个WEB应用程序,获得ServletContext 然后再调用其getAttribute() 得到你要的对象。

Java代码如下:

WebappA:

HttpSession session = request.getSession();
session.setAttribute("userId", "test");
ServletContext ContextA =session .getServletContext();
ContextA.setAttribute("session", session );

WebappB:

HttpSession sessionB = request.getSession();
ServletContext ContextB = sessionB.getServletContext();
ServletContext ContextA= ContextB.getContext("/WebappA");// 这里面传递的是 WebappA的虚拟路径
HttpSession sessionA =(HttpSession)ContextA.getAttribute("session");
System.out.println("userId: "+sessionA.getAttribute("userId"));

2、用数据库存放session数据 
将session数据存入数据库,不同web程序读取数据库数据即可。这样做的好处是实现简单,缺点是每次请求都要读写一次数据库,加大了系统开销。

3、用cookie代替session 
cookie是存放在本地硬盘上的文件,适合用于存放小量数据,且可以通过cookie.setPath(“/”)方法设置cookie为同一tomcat下的所有webapp共享。cookie.setPath(“/”)方法的参数”/”表示tomcat的webapps文件夹下的所有应用共享该cookie。

java代码 
写cookie:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
Cookie cookie = new Cookie("loginTime",df.format(new Date()));
cookie.setPath("/"); //Tomcat的webapps目录下共享
context.getHttpResponse().addCookie(cookie);

读cookie:

Cookie[] cookies = context.getHttpRequest().getCookies();
for(Cookie c :cookies ){
if(c.getName().equals("loginTime")){
System.out.println("loginTime: " + c.getValue());
}
} (原文地址:http://blog.csdn.net/jayyanzi/article/details/46561509)

[转]同一个tomcat不同项目的session共享问题的更多相关文章

  1. 【转】Nginx+Tomcat+Memcached集群Session共享

    cookie是怎样工作的? 例 如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名 是“Michael J ...

  2. Nginx+Tomcat+Memcached实现tomcat集群和session共享

    一.Nginx安装 详见前文:http://www.cnblogs.com/yixiwenwen/p/3574097.html 二.memcached安装和启动 详见前文:http://www.cnb ...

  3. 基于tomcat集群做session共享

    前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomc ...

  4. 使用spring-session共享springmvc项目的session

    一.说在前面 spring mvc项目,使用nginx,tomcat部署. 之前没做session共享,而nginx采用sticky模块进行分发. 但发现有时不能正确地指向同一台服务器,从而导致ses ...

  5. Tomcat集群的session共享

    配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务器的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...

  6. Tomcat利用MSM实现Session共享方案解说

    Session共享有多种解决方法,常用的有四种:1)客户端Cookie保存2)服务器间Session同步3)使用集群管理Session(如MSM) 4)把Session持久化到数据库 针对上面Sess ...

  7. Tomcat通过Memcached实现session共享的完整部署记录

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  8. Nginx和Tomcat负载均衡实现session共享(转)

    以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡,为了实现多个Tomcat之间的session共享,使用了开源的Memcached-Session-Manager框架. 此框架的优 ...

  9. Tomcat通过Redis实现session共享的完整部署记录

    对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...

随机推荐

  1. JAVA_SE基础——26.[深入解析]局部变量与成员变量的差别

    黑马程序猿入学blog ... 假设这章节非常难懂的话应该返回去先看  JAVA_SE基础--10.变量的作用域 定义的位置上差别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在 ...

  2. hibernate的入门crud

    package com.test; import com.demo.User; import org.hibernate.HibernateException; import org.hibernat ...

  3. tcmalloc asan

    http://blog.csdn.net/jinzhuojun/article/details/46659155 http://blog.csdn.net/hanlizhong85/article/d ...

  4. MongoDB副本集配置系列五:副本集的在线迁移

    MongoDB副本集的在线迁移 查看当前集群的状态: { "setName" : "gechongrepl", "setVersion" : ...

  5. 记:青岛理工ACM交流赛筹备工作总结篇

    这几天筹备青岛理工ACM交流赛的过程中遇到了不少问题也涨了不少经验.对非常多事也有了和曾经不一样的看法, ​一直在想事后把这几天的流水帐记一遍,一直没空直到今天考完C++才坐下来開始动笔.将这几天的忙 ...

  6. Java 底层机制(JVM/堆/栈/方法区/GC/类加载)

    转载:https://www.jianshu.com/p/ae97b692614e?from=timeline JVM体系结构 JVM是一种解释执行class文件的规范技术.   JVM体系结构 我翻 ...

  7. mysql日期相关的函数

    1.获取当前时间: /** 获得当前日期+时间(date + time)函数:now(), 常用 **/ select now() from dual; /** 获取当前时间戳,current_tim ...

  8. RHEL7-Samba共享测试

    Linux<----->windows之间共享 Samba使用2个进程 smb    ip之间的通信用smb  (tcp)       nmb    主机名之间的通信用nmb (netbi ...

  9. Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener. ...nested exception is java.lang.NoSuchMethodError:

    ssh 中,项目部署到服务器的时候,出现这样的奇葩的事情: 21-Oct-2017 11:27:15.953 INFO [localhost-startStop-1] org.apache.catal ...

  10. ORA-01034: ORACLE not available解决

    问题现象: alter user scott account unlock; ERROR at line 1:ORA-01034: ORACLE not availableProcess ID: 0S ...