前面談過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',這樣就不用判斷了.
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援topic.alibabacloud.com。