在tomcat下,context元素有一个crossContext属性,如果配置为true,则可以实现在同一个tomcat下的多个web应用之间实现ServletContext对象访问。该属性主要用于跨应用访问数据

在实际项目中遇到一个奇葩需求:在同一个页面框架下嵌套了2套应用!!!
app1和app2部署在同一个tomcat,且session超时时间使用tomcat全局配置。
app2存在定时ajax刷新,导致app2不会存在session超时的问题;因此,如果用户长期停留在app2某个定时刷新的页面,就会出现如下情况;
app2不会出现session超时,但是app1在指定时间之后就会session超时,这时访问app2页面不会跳转到登录页面,而点击app1页面元素就会退出登录,重新跳转到登录页面。
给用于一种很不自然的体验!

为了解决这个问题,做如下调整:
1. 首先,必须明确一个现实:app1和app2是2个独立的应用,所以对于浏览器访问都会在服务器端各自生成独立的session。
2. tomcat支持配置context元素的crossContext属性为true,使得在app2中可以访问到app1应用的ServletContext对象。
利用这个特性,可以在app2中知道app1应用下对应的session是否已经超时。如果已经超时,则在访问app2时就退出登录,跳转到登录页面。

1. tomcat配置

<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/app1" debug="0" reloadable="true" crossContext="true" />
<Context path="/app2" debug="0" reloadable="true" crossContext="true" />
</Host>

2. app1端

public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{
...
HttpSession session = req.getSession();
req.getSession().getServletContext().setAttribute(session.getId(), session);
resp.sendRedirect("app2?app1sid=" + session.getId()); // 将app1对应的sessonid传递给app2
...
}

3. app2端

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
...
if (pageType == 1) {// 从app1跳转到app2
// 获取在app1应用中对应的session id并保存到app2会话中
if(req.getSession().getAttribute(req.getSession().getId()) == null) {
String app1SesionId = request.getParameter("app1sid");
req.getSession().setAttribute(req.getSession().getId(), app1SesionId);
}
}else {
// 获取app1应用上下文
ServletContext app1Context = req.getSession().getServletContext().getContext("/app1");
String app1SessionId = req.getSession().getAttribute(req.getSession().getId()).toString();
HttpSession app1Session = (HttpSession)app1Context.getAttribute(app1SessionId);
try {
app1Session.getAttribute("login_user");
} catch (IllegalStateException e) {
e.printStackTrace();
// app1会话已经超时, 直接在访问app2时就退出登录
// 另外,还应该在app2定时刷新的地方检测app1会话是否已经超时,如果已经超时,则不再返回数据
req.getSession().invalidate();
resp.sendRedirect("/app1/login.do");
return;
}
}
...
}

关于context配置crossContext属性详见:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html
切记:该特性只适用于多个应用程序部署在同一个tomcat下的情形!

tomcat配置context的crossContext属性应用案例的更多相关文章

  1. Tomcat配置Context.xml上下文遇到的坑

    注意事项: 1. 在主机的 appBase 之外找到 WAR 和/或目录,并使用带有 docBase 属性的 context.xml 文件来定义它.避免双重部署导致出现不可预知的问题 {context ...

  2. Tomcat 配置 Context

    在 conf/Catalina/localhost/ 下添加 xml配置文件,文件名和站点名一致. 配置文件示例 <?xml version='1.0' encoding='utf-8'?> ...

  3. TOMCAT配置SSL认证为HTTPS协议服务

     1 . 问题概述 很多安全性要求较高的系统,都会使用安全套接字层(SSL)进行信息交换, Sun为了解决在Internet上的实现安全信息传输的解决方案.它实现了SSL和TSL(传输层安全)协议 ...

  4. 3.3.4 配置Tomcat的<Context>元素 (转)

    本章3.3.2节已经介绍了在Tomcat中发布JavaWeb应用的最快捷的方式,即只需把JavaWeb应用的所有文件复制到<CATALINA_HOME>/webapps目录下即可,Tomc ...

  5. Java进阶(十)java tomcat中context配置

    Tomcat中Context的配置 问题: java tomcat中<context> docBase属性是什么意思? 元素的属性: path:指定访问该Web应用的URL入口.  doc ...

  6. Tomcat中Context的配置

    Tomcat直接ip地址访问不用加端口和项目名 当我们开发完一个WEB项目 然后部署到tomcat下,正常情况下应该是这样访问:http://localhost:端口号/项目名 如果我们想让用户仅仅输 ...

  7. Tomcat增加Context配置不带项目名访问导致启动的时候项目加载两次

    eclipse发布web应用至tomcat,默认方式下访问该项目是需要带项目名称的,例http://localhost:8080/myapp/.现在需要改成这样访问http://localhost.修 ...

  8. Tomcat配置JNDI数据源

    经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定-还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.百度上那么花花绿绿的太多了,一个也没成功!...本例使用的数据 ...

  9. Tomcat配置全攻略

    tomcat的的下载地址http://www.apache.org/dist/jakarta/tomcat-4/ 1.安装jdk,详细操作请参考本站windows 2k和redhat 8.0下java ...

随机推荐

  1. 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...

  2. spring中的@Bean是否一定要与@Configuration一起用

        版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/little_newBee/article/details/80383691 在使用sprin ...

  3. 第一次有人把5G讲的这么简单明了

    第一次有人把5G讲的这么简单明了 鲜枣课堂 纯洁的微笑 今天 关于5G通信,常见的文章都讲的晦涩难懂,不忍往下看,特转载一篇,用大白话实现5G入门. 简单说,5G就是第五代通信技术,主要特点是波长为毫 ...

  4. 【SPOJ116】Intervals

    题目大意:有 N 个区间,在区间 [a, b] 中至少取任意互不相同的 c 个整数.求在满足 N 个区间约束的情况下,至少要取多少个正整数. 题解:差分约束系统模板题. 差分约束系统是对于 N 个变量 ...

  5. 用javascript来实现前端简单路由

    WEB开发中路由概念并不陌生,我们接触到的有前端路由和后端路由.后端路由在很多框架中是一个重要的模块,如Thinkphp,Wordpress中都应用了路由功能,它能够让请求的url地址变得更简洁.同样 ...

  6. HTTP属性管理器 初探

      1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...

  7. P NP NPC

    study from : http://www.matrix67.com/blog/archives/105

  8. Good Bye 2018

    Good Bye 2018 2018年最后一场CF,OVER! 弱弱的我只能做出3道A,B,D~~~~ 最后几分钟,感觉找到了C题的规律,结束的那一刻,提交了一发 "Wrong answer ...

  9. 安装webpack-dev-server始终不成功

    先安装了webpack,后来安装webpack-dev-server会一直出现这个问题,我把webpack提示的1.0.0 , 2.0.0 ,3.0.0全都在全局装了一遍都没用,还是会出现这个问题.最 ...

  10. Tomcat第一个站点介绍

    背景 在讨论如何组织源码目录之前,很有必要对现有web站点的组织结构进行测试,特别是2.2版本的API,在服务器版本上是不同的,所以在2.2之后的版本中,所有的服务器版本都要求能够使用标准的压缩web ...