tomcat如何共享多個web應(yīng)用會話

來源:tomcat如何共享多個web應(yīng)用會話
作者:seaboat 汪洋之舟

問題

今天有位朋友問了個問題,大致是:tomcat下兩個Java web抑月,一個是商城,一個是直播,從商城登錄后输拇,再跳轉(zhuǎn)到直播,發(fā)現(xiàn)處于非登錄狀態(tài)贤斜。

解決思路

  1. 將session抽出來成一個session服務(wù)策吠,統(tǒng)一通過該服務(wù)操作session逛裤。
  2. tomcat內(nèi)部用會話管理器獲取會話時遍歷所有context內(nèi)的會話。

方案1

重寫獲取session方法即可猴抹。

方案2

找了源碼發(fā)現(xiàn)已經(jīng)支持類似遍歷所有context內(nèi)的會話的形式带族,首先獲取session時,如果cressContext屬性為true蟀给,則會在獲取不到時嘗試遍歷所有context是否存在該sessionid蝙砌,如果存在則在本context根據(jù)sessionid創(chuàng)建自己的session對象。

public HttpSession getSession(boolean create) {

        if (crossContext) {

            // There cannot be a session if no context has been assigned yet
            if (context == null)
                return (null);

            // Return the current session if it exists and is valid
            if (session != null && session.isValid()) {
                return (session.getSession());
            }

            HttpSession other = super.getSession(false);
            if (create && (other == null)) {
                // First create a session in the first context: the problem is
                // that the top level request is the only one which can 
                // create the cookie safely
                other = super.getSession(true);
            }
            if (other != null) {
                Session localSession = null;
                try {
                    localSession =
                        context.getManager().findSession(other.getId());
                    if (localSession != null && !localSession.isValid()) {
                        localSession = null;
                    }
                } catch (IOException e) {
                    // Ignore
                }
                if (localSession == null && create) {
                    localSession = 
                        context.getManager().createSession(other.getId());
                }
                if (localSession != null) {
                    localSession.access();
                    session = localSession;
                    return session.getSession();
                }
            }
            return null;

        } else {
            return super.getSession(create);
        }

    }

context(web應(yīng)用)獲取跨應(yīng)用session時通過類似下面操作獲劝侠怼:

request.getSession().getServletContext().getContext("/app2").getAttribute("att2"); 

這是因為request會根據(jù)cookies的sessionid獲取到session對象择克,這時不會報找不到,因為前面已經(jīng)根據(jù)其他sessionid創(chuàng)建了一個session對象前普,然后getContext操作會獲取對應(yīng)url的context肚邢,接著進(jìn)行會話操作。

public ServletContext getContext(String uri) {

        // Validate the format of the specified argument
        if (uri == null || !uri.startsWith("/")) {
            return null;
        }

        Context child = null;
        try {
            // Look for an exact match
            Container host = context.getParent();
            child = (Context) host.findChild(uri);

            // Non-running contexts should be ignored.
            if (child != null && !child.getState().isAvailable()) {
                child = null;
            }

            // Remove any version information and use the mapper
            if (child == null) {
                int i = uri.indexOf("##");
                if (i > -1) {
                    uri = uri.substring(0, i);
                }
                // Note: This could be more efficient with a dedicated Mapper
                //       method but such an implementation would require some
                //       refactoring of the Mapper to avoid copy/paste of
                //       existing code.
                MessageBytes hostMB = MessageBytes.newInstance();
                hostMB.setString(host.getName());

                MessageBytes pathMB = MessageBytes.newInstance();
                pathMB.setString(uri);

                MappingData mappingData = new MappingData();
                ((Engine) host.getParent()).getService().findConnectors()[0].getMapper().map(
                        hostMB, pathMB, null, mappingData);
                child = (Context) mappingData.context;
            }
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            return null;
        }

        if (child == null) {
            return null;
        }

        if (context.getCrossContext()) {
            // If crossContext is enabled, can always return the context
            return child.getServletContext();
        } else if (child == context) {
            // Can still return the current context
            return context.getServletContext();
        } else {
            // Nothing to return
            return null;
        }
    }

更多內(nèi)容請關(guān)注:極樂科技

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拭卿,一起剝皮案震驚了整個濱河市道偷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌记劈,老刑警劉巖勺鸦,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異目木,居然都是意外死亡换途,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門刽射,熙熙樓的掌柜王于貴愁眉苦臉地迎上來军拟,“玉大人,你說我怎么就攤上這事誓禁⌒赶ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵摹恰,是天一觀的道長辫继。 經(jīng)常有香客問我,道長俗慈,這世上最難降的妖魔是什么姑宽? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮闺阱,結(jié)果婚禮上炮车,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好瘦穆,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布纪隙。 她就那樣靜靜地躺著,像睡著了一般扛或。 火紅的嫁衣襯著肌膚如雪瘫拣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天告喊,我揣著相機與錄音,去河邊找鬼派昧。 笑死黔姜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒂萎。 我是一名探鬼主播秆吵,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼五慈!你這毒婦竟也來了纳寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤泻拦,失蹤者是張志新(化名)和其女友劉穎毙芜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體争拐,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡腋粥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了架曹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘冲。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绑雄,靈堂內(nèi)的尸體忽然破棺而出展辞,到底是詐尸還是另有隱情,我是刑警寧澤万牺,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布罗珍,位于F島的核電站,受9級特大地震影響脚粟,放射性物質(zhì)發(fā)生泄漏靡砌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一珊楼、第九天 我趴在偏房一處隱蔽的房頂上張望通殃。 院中可真熱鬧,春花似錦、人聲如沸画舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曲聂。三九已至霹购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朋腋,已是汗流浹背齐疙。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旭咽,地道東北人贞奋。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像穷绵,于是被迫代替她去往敵國和親轿塔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在仲墨,面了一些公司勾缭,掛了不少,但最終還是拿到小米目养、百度俩由、阿里、京東癌蚁、新浪采驻、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,209評論 11 349
  • 轉(zhuǎn)自 :http://blog.csdn.net/taoff/articles/1921009.aspx 一匈勋、術(shù)語...
    stone_yao閱讀 6,167評論 0 31
  • 看了紀(jì)錄片A Day In A Life,各個國家的人礼旅,各個階層的人,有的在戰(zhàn)亂里膽戰(zhàn)心驚的過日子洽洁,有的在未知的險...
    大大怪怪怪怪閱讀 128評論 0 0
  • 堅持學(xué)習(xí)分享第53天痘系,2017年9月8日星期五。 咨詢是一件非常有意義的事饿自,通過咨詢咨詢師會有所成長汰翠。但是學(xué)咨詢的...
    奇峰_5114閱讀 764評論 0 0