首頁 >後端開發 >php教程 >如何解決Yii2下session跨網域共存的問題

如何解決Yii2下session跨網域共存的問題

不言
不言原創
2018-06-15 10:26:481818瀏覽

這篇文章主要介紹了Yii2下session跨域名共存的解決方案,內容挺不錯的,現在分享給大家,也給大家做個參考。

前面談過session相關配置,在開發的時候,常需要跨域共用session的是登錄模組,我相信很多開發的朋友的都遇到過,只需要一個地方登錄,相關聯的網站也是處於登入狀態。兩種情況:一種9streets.cn和a.9streets.cn之間,另一種是a.com b.com之間,這幾天總結了一下處理方法。

無論是一二級域名,和不同域名下的跨域,無非要達到兩點:

  • 客戶端訪問同一個sessionId,

  • 所有網域對應的伺服器所存取的session的資料的位置必須一致。

1.存取共同的sessionId主要是透過把目前的sessionId寫入cookie裡面

cookie在不同網域下是不能存取的,我們需要在訪問在後台設定使用者在登入的時候,把需要共用的登入資訊的域名,如果是在1,2級域名下,直接把cookie設定為所屬主域名,例如:

setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".a.com");

也許你會問:如果是在不同的網域呢?採用P3P技術簡單解決,實現原理,在訪問網站x.com的時候,y.com程序觸發y.com文件的寫入sessionid值,sessionid值便可以獲取,然後把seesion值存入數據庫,取相同的sessionid值便可。這就要求y.com裡面的程式檔案必要能跨網域存取,預設情況下,瀏覽器是不能跨網域設定cookie的,加上p3p頭後才行。在對應php檔案加上:header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

2.session資料儲存位置一致的實作方法

session該資料預設是存放在伺服器的tmp檔案下的,是以檔案形式存在,而非儲存在伺服器的記憶體中,在這裡我們得修改為所有網域下都能存取的方式。網路上介紹了資料庫存儲,文件形式存儲,內存存儲, 如果用資料庫存儲session數據,網站的訪問量很大的話,SESSION 的讀寫會頻繁地對數據庫進行操作,效率就會明顯降低,可以考慮存在內存伺服器來實現,下面的session.rar裡面介紹的是資料庫存session的實例。

在yii2下處理這中問題,根據網上搜到的教程最終配置成功教程如下:

在frontend的config資料夾中main.php中設定

$host = explode('.', $_SERVER["HTTP_HOST"]);
if (count($host) > 2) {
  define('DOMAIN', $host[1] . '.' . $host[2]);
} else {
  define('DOMAIN', $host[0] . '.' . $host[1]);
}
define('DOMAIN_HOME', 'www.' . DOMAIN);
define('DOMAIN_USER_CENTER', 'man.' . DOMAIN);
define('DOMAIN_API', 'api.' . DOMAIN);
define('DOMAIN_EMAIL', 'mail.' . DOMAIN);
define('DOMAIN_LOGIN', 'login.' . DOMAIN);
define('DOMAIN_IMG', 'img.' . DOMAIN);

然後設定User 和Session:

#
'user' => [
  'enableAutoLogin' => true,
  'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN],
],
'session' => [
  'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],
  'timeout' => 3600,
],

這裡在設定項目的user和session裡我把domain寫死了例如:'domain'=>'.baidu.com',這樣就不用判斷了.

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

Yii框架中使用jquery的有關問題

以上是如何解決Yii2下session跨網域共存的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn