跨應用程式的session共享

2021-08-30 22:28:32 字數 1282 閱讀 2784

常常有這樣的情況,乙個大專案被分割成若干小專案開發,為了能夠互不干擾,要求每個小專案作為乙個單獨的web應用程式開發,可是到了最後突然發現某幾個小專案之間需要共享一些資訊,或者想使用session來實現sso(single sign on),在session中儲存login的使用者資訊,最自然的要求是應用程式間能夠訪問彼此的session。

然而按照servlet規範,session的作用範圍應該僅僅限於當前應用程式下,不同的應用程式之間是不能夠互相訪問對方的session的。各個應用伺服器從實際效果上都遵守了這一規範,但是實現的細節卻可能各有不同,因此解決跨應用程式session共享的方法也各不相同。

首先來看一下tomcat是如何實現web應用程式之間session的隔離的,從tomcat設定的cookie路徑來看,它對不同的應用程式設定的cookie路徑是不同的,這樣不同的應用程式所用的session id是不同的,因此即使在同乙個瀏覽器視窗裡訪問不同的應用程式,傳送給伺服器的session id也可以是不同的。

根據這個特性,我們可以推測tomcat中session的記憶體結構大致如下。

筆者以前用過的iplanet也採用的是同樣的方式,估計sunone與iplanet之間不會有太大的差別。對於這種方式的伺服器,解決的思路很簡單,實際實行起來也不難。要麼讓所有的應用程式共享乙個session id,要麼讓應用程式能夠獲得其他應用程式的session id。

在tomcat中則沒有這麼方便的選擇。在tomcat版本3上,我們還可以有一些手段來共享session。對於版本4以上的tomcat,目前筆者尚未發現簡單的辦法。只能借助於第三方的力量,比如使用檔案、資料庫、jms或者客戶端cookie,url引數或者隱藏欄位等手段。

我們再看一下weblogic server是如何處理session的。

從截圖畫面上可以看到weblogic server對所有的應用程式設定的cookie的路徑都是/,這是不是意味著在weblogic server中預設的就可以共享session了呢?然而乙個小實驗即可證明即使不同的應用程式使用的是同乙個session,各個應用程式仍然只能訪問自己所設定的那些屬性。這說明weblogic server中的session的記憶體結構可能如下

對於這樣一種結構,在session機制本身上來解決session共享的問題應該是不可能的了。除了借助於第三方的力量,比如使用檔案、資料庫、jms或者客戶端cookie,url引數或者隱藏欄位等手段,還有一種較為方便的做法,就是把乙個應用程式的session放到servletcontext中,這樣另外乙個應用程式就可以從servletcontext中取得前乙個應用程式的引用。示例**如下,

應用程式a

應用程式b

SESSION 跨伺服器共享session

首先,建立儲存session的表sessions createtablesessions sidchar 32 notnull,expiryint 11 unsignednotnull,valuetextnotnull,primarykey sid 註冊session的頁面session reg.p...

跨域和session共享

負載均衡 主要是將大量的併發請求按照一定的規律分發給不同的伺服器處理,減少某台伺服器的瞬間壓力 分配演算法 輪詢,權重,ip雜湊演算法 跨域 是指a頁面想獲取b頁面資源,如果a b頁面的協議 網域名稱 埠 子網域名稱不同,所進行的訪問行動都是跨域的,而瀏覽器為了安全問題一般都限制了跨域訪問,也就是不...

跨伺服器session共享

1.基於nfs的session共享 nfs是net filesystem的簡稱,最早由sun公司為解決unix網路主機間的目錄共享而研發。這個方案實現最為簡單,無需做過多的二次開發,僅需將共享目錄伺服器mount到各頻道伺服器的本地session目錄即可,缺點是nfs依託 於復 雜的安全機制和檔案系...