前面談過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, identityhtml' target='_blank'>Cookie = [ name = _identity , httpOnly = true, domain = . . DOMAIN], session = [ cookieParams = [ domain = . . DOMAIN, lifetime = 0], timeout = 3600,],
這里在配置項的user和session里 我把domain寫死了例如: domain = .baidu.com ,這樣就不用判斷了.
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
以上就是如何解決Yii2下session跨域名共存的問題的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答