专栏首页后端开发随笔tomcat配置context的crossContext属性应用案例

tomcat配置context的crossContext属性应用案例

在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下的情形!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信支付之扫码、APP、小程序支付接入详解

    做电商平台的小伙伴都知道,支付服务是必不可少的一部分,今天我们开始就说说支付服务的接入及实现。目前在国内,几乎90%中小公司的支付系统都离不开微信支付和支付宝支...

    JAVA葵花宝典
  • 4个点说清楚Java中synchronized和volatile的区别

    1、Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、fina...

    程序员追风
  • 如何设计实现一个轻量的开放API网关

    随着业务的发展, 所对接的第三方越来越多, 各个业务系统面临着同样一个问题: 如何让第三方安全快速接入. 此时有一个集验签、鉴权、限流、降级等功能于一身的API...

    黄泽杰
  • 从零开始学TensorFlow【01-搭建环境、HelloWorld篇】

    最近在学习TensorFlow的相关知识,了解了TensorFlow一些基础的知识,现在周末有空了,就写写一些笔记,记录一下自己的成长~

    Java3y
  • 带你搭一个SpringBoot+SpringData JPA的Demo

    不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和Spri...

    Java3y
  • TensorFlow读写数据

    众所周知,要训练出一个模型,首先我们得有数据。我们第一个例子中,直接使用dataset的api去加载mnist的数据。(minst的数据要么我们是提前下载好,放...

    Java3y
  • 定心丸之没有监控的系统就是半废 No.157

    上次写了一篇文章。对业务系统的监控 No.118 。讲的是我们在开发完成之后还需要做些什么事情,我们的系统有哪些方面是需要监控的,很多小伙伴对于怎么落地其实还...

    大蕉
  • 聊聊dubbo的DubboComponentScanRegistrar

    本文主要研究一下dubbo的DubboComponentScanRegistrar

    codecraft
  • 从零开始学TensorFlow【什么是TensorFlow?】

    TensorFlow是什么意思?Tensor?Flow?这篇文章介绍TensorFlow一些最基础的知识。

    Java3y
  • 每日算法题:Day 23(Python)

    每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友...

    算法工程师之路

扫码关注云+社区

领取腾讯云代金券