1. 程式人生 > >跨域共享session心得

跨域共享session心得

    在公司最近開發的bbc專案中,由於公司的業務是跨境電商平臺,網站使用的是.hk的域名,沒有備案。但是業務部門要求必須支援當前主流的第三方登入,但是微信和qq必須是備案的域名;所以公司這邊啟用了一個.com的域名。在.com下登入/退出,然後.hk也要同步登入或退出;這就牽涉到session同步問題;
    業務流程圖如下:
    ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190103091255958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpZWdhbzE5OTA=,size_16,color_FFFFFF,t_70)

傳遞session_id有4種方法
  1、 通過cookie
  2、 設定php.ini中的session.use_trans_sid=1,讓PHP自動跨頁傳遞session id
  3、 手動通過url或隱藏表單傳值
  4、 用檔案或資料庫方式傳遞,在通過其他key對應取值

預想的解決方案有以下幾種:
1、redis/memcache/file快取共享:因為會員中心和商城系統部署在同一臺伺服器上面,採用的是同一套程式碼,每個模組都有自己的單一入口,登陸功能屬於會員中心功能模組,所以只需要把域名.com指向member模組下;因為共享同一個session目錄,所以只需要在登陸成功以後,在跳轉登陸成功頁面,使用隱藏iframe方式開啟.hk的同步登入介面網頁,同步登入介面帶有加密的session_id的值,然後在介面中進行解密,然後重新開始session,重置.hk的session_id,同步成功

2、資料庫共享session:建立一個專門用來儲存session的資料庫表,這樣的話各服務就能很方便的進行session的共享了,但是這裡面有個問題,如果網站訪問量少,併發小問題不大。如果房展併發量大的話,session的讀寫頻繁操作,會消耗大量資源;當然這時你也可以引入memcache來存放session,採用mysql+memcache相結合的方式

我採用的的是第一種方式,使用的是redis進行session的共享,因為商城本身採用了redis。並且redis的支援的資料結構比memcache多。我目前想到的只有這些,如果您有更好的辦法,請留言,謝謝