前面談過session相關配置,在開發的時候,常需要跨域共用session的是登錄模塊,我相信很多開發的朋友的都遇到過,只需要一個地方登錄,相關聯的網站也是處于登錄狀態。兩種情況:一種9streets.cn和a.9streets.cn之間,另一種是a.com b.com之間,這幾天總結了一下處理方法。
無論是一二級域名,和不同域名下的跨域,無非要達到兩點:
- 客戶端訪問同一個sessionId,
- 所有域名對應的服務器訪問的session的數據的位置必須一致。
1.訪問共同的sessionId主要是通過把當前的sessionId寫進cookie里面
cookie在不同域名下是不能訪問的,我們需要在訪問在后臺設置用戶在登錄的時候,把需要共用的登錄信息的域名,如果是在1,2級域名下,直接把cookie設置為所屬主域名,例如:
1
|
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中配置
1
2
3
4
5
6
7
8
9
10
11
12
|
$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:
1
2
3
4
5
6
7
8
|
'user' => [ 'enableAutoLogin' => true, 'identityCookie' => [ 'name' => '_identity' , 'httpOnly' => true, 'domain' => '.' . DOMAIN], ], 'session' => [ 'cookieParams' => [ 'domain' => '.' . DOMAIN, 'lifetime' => 0], 'timeout' => 3600, ], |
這里在配置項的user和session里 我把domain寫死了例如:'domain'=>'.baidu.com',這樣就不用判斷了.
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.yiichina.com/tutorial/1073