1. 程式人生 > >Java tomcat 實現二級域名session共享(良心共享)

Java tomcat 實現二級域名session共享(良心共享)

本文主要目的:一個使用者在一臺伺服器的使用者中心登入後產生的SESSION,然後訪問在不同的伺服器上的不同二級域名的應用都能共享到這個使用者登入後的SESSION,可以說是單點登入。

用到的技術:J2E,Tomcat,Redis,Cookie

先闡述兩個概念:

1)什麼是一級域名和二級域名? 比如說你有一個域名是  aa.com  ,那麼aa.com就是你這個域名的一級域名,www.aa.com和app.aa.com是這個域名的二級域名。可以簡單地理解為,你的域名中含有多少個點(.)就是多少級域名(不知道這個理解是否完全正確哈)。

2)SESSION是根據什麼劃分的? 頁面前端決定是不是同一個SESSION看三樣東西:SESSION的Value、Domain和Path。如果這三樣東西都相同,後臺就是根據這三個值來維護SESSION的。這篇文章就是利用了這一特性。

所以,我想要做的事情是指在 passport.aa.com下面進行使用者登入後,訪問 www.aa.com和app.aa.com下的應用都是登入狀態的。我相信你在看到我的這篇文章之前,可能已經在網上找了一大推的例子了。So am l,只可惜,並沒有解決我的問題,很多方法都是無法使用的,所以才會有這篇文章的產生。廢話不多說了,開始吧!

首先,如果是將SESSION交給spring-session來管理的話,這裡有一點要注意下的是,生成的SESSION  ID的key是叫SESSION,不是JSESSIONID。對比下下面兩圖。



我使用的是Tomcat的 RedisSession 管理,下載  所依賴的jar包,

點選這裡。將下載好的jar包放到Tomcat的lib下面,然後在Tomcat 的conf/context.xml檔案上加上如下內容

    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    host="localhost"
    port="6379"
    password=""
    database="0"
    maxInactiveInterval="60" />

如圖:


Okay,準備好這些工作後,我們看下後臺的Java程式碼怎麼寫

        新增到SESSION的程式碼


        獲取SESSION的程式碼


其實我們用的是一個小技巧就是利用Cookie來模仿一個SESSION ID 的 Key,Value,Domail,Path都一致的Session cookie。好了,將寫好的專案部署到線上(這個要在線上,並使用域名來進行訪問,否則不好測試)。

我部署的是一個多伺服器多Tomcat下的結構,這裡Tomcat都連結了同一個Redis伺服器, 結構大概是這樣:

伺服器一 有一個 tomcat ,部署著剛才的寫好的程式,目錄名 是user;

伺服器二有一個 tomcat ,部署著剛才的寫好的程式,目錄名 是node;

伺服器三有一個 tomcat ,部署著剛才的寫好的程式,目錄名 是node;

伺服器二和三使用Nginx的反向代理,做了負載。

好了,開始測試吧!


Okay,看到預期的兩個一樣的SESSION ID,嘗試下不同的二級域名下是否能拿到資料:


So far so good!不停重新整理下,發現都是能獲取到資料的,如果我一開始的時候不做負載,多搞一個二級的域名來訪問可能會更好理解些,但樓主就偷下懶不去修改這個缺點了,大家可以去嘗試下!

=======================發愁的分割線============================

然而,事情還沒有完!

如果我將所有的SESSION清除掉,先訪問伺服器二獲取SESSION的介面,然後再訪問伺服器一的加SESSION的介面,那麼結果會是怎樣呢?


完蛋了,你會發現在請求伺服器二的時候重新生成了一個SESSION ID ,兩個ID的Value不一樣了。

不用急,利用你一開始的加SESSION的道理,將SESSION也導回到伺服器一的後臺上去就可以了,在原來獲取SESSION的程式碼上簡單改進下:


這樣在伺服器一建立SESSION的時候也可能是用到伺服器二的SESSION ID了!

圓滿結束!程式碼獲取,點這下載,再分享一款 Redis的視覺化管理工具 redis-desktop-manager,點這下載