在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. Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)

    啊...表示一大早还没睡醒就开始打比赛(开始前一分钟的我还在桌子上趴着休眠)...表示题目思路清奇(尤其C题)...但是我还是太蒻了...\(D\)题暴力都没打...题解正式开始之前先\(\%\)一下 ...

  2. MVC使用记录

    如何获得MVC中,控制器和方法名字.这可以用于给当前选定菜单加个选定样式 获取控制器名称:(在View中写法) ViewContext.RouteData.Values["controlle ...

  3. cf1000F One Occurrence (线段树)

    这题我是离线做的 设i位置的数上次出现的位置是pre[i](如果第一次出现那就是0) 可以想到,用线段树维护一个区间的pre的最小值,如果它小于区间左端点,那这个数就是一个合法的答案 但直接这样做是错 ...

  4. Finding Lines UVALive - 6955(随机)

    给出n个点,问你有没有可能存在一条直线,这n个点中存在百分号p以上点在这条直线上. 两个点确定一条直线,所以可以随机枚举两个点,然后用这条直线去判断其他的点是不是在这条直线上,如果在这个直线上的点超过 ...

  5. [JLOI2016/SHOI2016]侦察守卫(树形dp)

    小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树. 游戏中有一种道具叫做侦查守卫,当一名玩家在一个点 ...

  6. Hyper-V

    docker与vm同时安装,会导致虚拟机无法启动及网络不通等问题,解决方法分为两步. 1.在网络连接中禁用vEthernet连接. 2.控制面板>程序>程序和功能中 >启用或关闭wi ...

  7. 关于Autosar中的NM模块的理解

    本篇文章主要介绍AutoSar中关于NM模块的理解. 阅读本篇文章希望达到的目的: 1. NM(网络管理)是用来做什么的: 2. AutoSar中网络管理的原理: 3.项目实例介绍 1. NM(网络管 ...

  8. codeforces Hello 2019(未写完)

    A. Gennady and a Card Game a题惯例签到题 题意:给你一张牌,再给你5张牌,判断能不能出一次牌... 所以只要检查第二行中的某个卡是否与第一行中的卡具有共同字符 有就输出YE ...

  9. JDK和CGLIB动态代理区别

    背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结. 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/de ...

  10. div设置overflow-scroll滚动之后,jq获取其子元素的offset.top出现问题。

    先上个图: 布局很简单,左右超过屏幕的部分自行滚动. 1. html <div class="ce-container"> <div class="ce ...