溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在PHP中利用session實現(xiàn)跨子域

發(fā)布時間:2020-12-16 14:52:33 來源:億速云 閱讀:157 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了如何在PHP中利用session實現(xiàn)跨子域,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Session主要分兩部分:

一個是Session數(shù)據(jù),該數(shù)據(jù)默認情況下是存放在服務(wù)器的tmp文件下的,是以文件形式存在。

另一個是標志著Session數(shù)據(jù)的Session Id,Session ID,就是那個 Session 文件的文件名,Session ID 是隨機生成的,因此能保證唯一性和隨機性,確保 Session 的安全。一般如果沒有設(shè)置 Session 的生存周期,則 Session ID 存儲在內(nèi)存中,關(guān)閉瀏覽器后該 ID 自動注銷,重新請求該頁面后,重新注冊一個 session ID。如果客戶端沒有禁用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是存儲 Session ID Session 生存期的角色。

兩個不同的域名網(wǎng)站,想用同一個Session,就是牽扯到Session跨域問題!

默認情況下,各個服務(wù)器會各自分別對同一個客戶端產(chǎn)生 SESSIONID,如對于同一個用戶瀏覽器,A 服務(wù)器產(chǎn)生的 SESSION ID 是 11111111111,而B 服務(wù)器生成的則是222222。另外,PHP 的 SESSION數(shù)據(jù)都是分別保存在本服務(wù)器的文件系統(tǒng)中。想要共享 SESSION 數(shù)據(jù),那就必須實現(xiàn)兩個目標:

一個是各個服務(wù)器對同一個客戶端產(chǎn)生的SESSION ID 必須相同,并且可通過同一個 COOKIE 進行傳遞,也就是說各個服務(wù)器必須可以讀取同一個名為 PHPSESSID 的COOKIE;

另一個是 SESSION 數(shù)據(jù)的存儲方式/位置必須保證各個服務(wù)器都能夠訪問到。這兩個目標簡單地說就是多服務(wù)器(A、B服務(wù)器)共享客戶端的 SESSION ID,同時還必須共享服務(wù)器端的 SESSION 數(shù)據(jù)。

有三種解決方法:

1.只要在php頁面的最開始(要在任何輸出之前,并且在session_start()之前)的地方進行以下設(shè)置

ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_lifetime', '1800');

2.在php.ini里設(shè)置

session.cookie_path = /
session.cookie_domain = .mydomain.com
session.cookie_lifetime = 1800

3.在php頁面最開始的地方(條件同1)調(diào)用函數(shù)

session_set_cookie_params(1800 , '/', '.mydomain.com');

session 有個Session_id 作為session的惟一標志。

要實現(xiàn)Session子域,實際上是在同一個瀏覽器中在訪問兩個A 和B子域時,其session是相同的。

由于session都是保存在服務(wù)器端,如何讓兩臺服務(wù)器識別這兩個請求是由一個瀏覽器發(fā)出的呢?

Cookie是保存在客戶端的,服務(wù)器通常通過Cookie來識別不同的客戶端,因此,可以使用Cookie來保存Session_id, 并將該Cookie設(shè)置為父域。

例如,當訪問a.sso.com 時,就將session_id 保存在Cookie中。當訪問b.sso.com時,則將session_id  從Cookie中取出來,

并通過session_id 去某個持久化容器中獲取Session。

例如,當訪問a.sso.com 時,就將session_id 保存在Cookie中。當訪問b.sso.com時,則將session_id  從Cookie中取出來,

并通過session_id 去某個持久化容器中獲取Session。

在本實驗中,使用PHP來作為實驗語言。

當訪問a.sso.com時,則將通過
 

session_start();
 $_SESSION['person'] = "SBSBSBS";
 $session_id = session_id();
 setcookie('name',$session_id,time()+3600*24,'/','SSO.com');

  將session_id 保存在cookie中。

由于在PHP中,session是一個數(shù)組,PHP有 serialize() 函數(shù),將數(shù)組序列化

$session_value = serialize($_SESSION);

然后將$session_value 保存在數(shù)據(jù)庫中。

在訪問b.sso.com時,則從cookie中獲取到session_id,然后到數(shù)據(jù)庫中根據(jù)session_id將 經(jīng)過序列化過的session 獲取出來

接著就可以對該session進行操作,實現(xiàn)session 跨子域。

由于將session保存在數(shù)據(jù)庫中,存取都是比較費時的操作,因此可以將session保存在緩存中,例如memcached 或者redis中,

這樣對session的存取操作就比較快速了。

使用緩存還有個好處就是,通常session有一定得存活時間,如果存在數(shù)據(jù)庫中,還需要保存該session的存活時間,在取出session時,還需要判斷其是否失效。

使用緩存存放session就可以在存放的時候設(shè)置其存活時間,減少了取出后的失效判斷這一個過程。

我的解決方法是在入口出添加如下代碼:

ini_set('session.cookie_path', '/');

 ini_set('session.cookie_domain', '.jb51.net'); //注意jb51.net換成你自己的域名

ini_set('session.cookie_lifetime', '1800');

如圖:

站點一

如何在PHP中利用session實現(xiàn)跨子域

站點二

如何在PHP中利用session實現(xiàn)跨子域

可以看到兩個站點的PHPSESSID是一樣的,當然也解決了跨子域名的問題了

上述內(nèi)容就是如何在PHP中利用session實現(xiàn)跨子域,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI