1. 程式人生 > >同一瀏覽器、同一域、同一時間、多個頁面選項卡共用同一session,區分不同頁面選項卡的解決方法

同一瀏覽器、同一域、同一時間、多個頁面選項卡共用同一session,區分不同頁面選項卡的解決方法

    在web開發中,session機制常常用於區分使用者身份,但session也有無能為力之處,設想一個情形:

    【多個使用者】分別使用【不同選項卡頁面】在【同一會話時間】公用【同一】瀏覽器,【登入同一應用】,此時服務端使用session將【無法區分】不同選項卡頁面。

     注意,是同一電腦的同一瀏覽器不是不同瀏覽器。

    這個情形可能存在嗎?當然可能,比如一個多使用者web saas應用,有兩個使用者A和B,有一天B求助A,要求A參照A自己的應用設定為B進行配置,在這種情況下那麼A很有可能在同一瀏覽器同一時間下同時登陸A自己的帳號(用於參考)和B的帳號(用於配置)。此時服務端如果不區分不同選項卡,那麼A和B可能就沒辦法同時登入,要麼A和B的session可能會混一起出錯。

    當然,現實的情況可能遠比這個多。

    本人暫未了解到像session機制一樣系統、全域性、環境級的解決區分不同瀏覽器客戶的,能夠區分選項卡方法,但有個人的一些觀點思路:

    要解決這個問題,就要讓服務端區分不同的選項卡頁面。

    先想

1對於cookie是否不同選項卡的都會同樣帶回呢?好像真的是機械的全部帶回不區分不同選項卡。

        2同一瀏覽器不同頁面向同一域發請求時是否攜帶了這個選項卡的特別唯一的資訊呢?個人看了半天網路協議監控,好像似乎沒有。

3服務端是否能區分不同選項卡呢?考慮會不會瀏覽器端不同頁面使用不同的客戶端埠傳送資訊呢?如果是不同埠,那就能用埠號區分,然而好像似乎可能也不區分埠。

        那就暫且這樣解決:

     【頁面到客戶端後,不同選項卡頁面生成固定唯一的識別符每次帶回伺服器】

     不同頁面同一時間可以通過js的Math.random動態生成一個隨機字串不同的識別符,雖然Math.random是偽隨機,兩頁面撞一起的可能性還是比較小的(當然還有其他方法)。

    暫將這個識別符叫做tabUID,生成tabUID後,給頁面的ajax、jsonp等通訊基礎類新增這個固定的tabUID,要求每次把這個tabUID帶回服務端。服務端的程式用session時首先就要依據tabUID在session中選擇不同的使用者資料session進行處理,比如$_SESSION['tabUID']['SESSION']。叫它子session或者tab session唄。

    當然,這只是權宜之計,也望指教。