首頁 php教程 PHP开发 PHP中session跨子域的三種實作方法

PHP中session跨子域的三種實作方法

Dec 24, 2016 am 09:09 AM

在之前做東西的時候session一般就直接存在資料庫中這樣就能解決跨域不僅僅是跨子域,但是今天遇到這個問題是,自己要在別人現有的東西上面做修改。由於僅僅是子域當時就想肯定有簡單的解決方法,度娘了找到了三種解決辦法:

Session主要分兩部分:

一個是Session數據,該數據默認情況下是存放在伺服器的tmp檔案下的,是以檔案形式存在。

另一個是標誌著Session資料的Session Id,Session ID,就是那個 Session 檔案的檔案名,Session ID 是隨機產生的,因此能確保唯一性和隨機性,確保 Session 的安全。一般如果沒有設定 Session 的生存週期,則 Session ID 儲存在記憶體中,關閉瀏覽器後該 ID 自動登出,重新要求該頁面後,重新註冊一個 session ID。如果用戶端沒有停用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是儲存 Session ID 和 Session 生存期的角色。

兩個不同的網域網站,想用同一個Session,就是牽扯到Session跨域問題!

預設情況下,各個伺服器會各自分別對同一個客戶端產生 SESSIONID,如同一個使用者瀏覽器,A 伺服器產生的 SESSION ID 是 11111111111,而B 伺服器產生的則是2222222。另外,PHP 的 SESSION資料都是分別保存在本伺服器的檔案系統中。想要共享SESSION 數據,那就必須實現兩個目標:

一個是各個伺服器對同一個客戶端產生的SESSION ID 必須相同,並且可透過同一個COOKIE 進行傳遞,也就是說各個伺服器必須可以讀取同一個名為 PHPSESSID 的COOKIE;

另一個是SESSION 資料的儲存方式/位置必須確保各個伺服器都能夠存取。這兩個目標簡單來說就是多伺服器(A、B伺服器)共享客戶端的 SESSION ID,同時也必須共享伺服器端的 SESSION 資料。

有三種解決方法:

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

ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_lifetime', '1800');
登入後複製

  

.ini裡設定

session.cookie_path = /
session.cookie_domain = .mydomain.com
session.cookie_lifetime = 1800
登入後複製

   

3.在php頁最開始的地方(條件同1)調用函數

session_set_cookie_params(1800 , '/', '.mydomain.com');
登入後複製

   

的標誌

ses。


要實現Session子域,實際上是在同一個瀏覽器中在存取兩個A 和B子域時,其session是相同的。


由於session都是保存在伺服器端,如何讓兩台伺服器辨識這兩個請求是由一個瀏覽器發出的呢?


Cookie是保存在客戶端的,伺服器通常透過Cookie來識別不同的客戶端,因此,可以使用Cookie來保存Session_id, 並將該Cookie設定為父域。


例如,當訪問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是一個數組,PHP有 serialize() 函數,將數組序列化

$session_value = serialize($_SESSION);
登入後複製

   

然後將$session_value sion_value 。


在訪問b.sso.com時,則從cookie中獲取到session_id,然後到資料庫中根據session_id將經過序列化過的session 獲取出來


接著就可以對該session進行操作,實現session 跨子域。


由於將session保存在資料庫中,存取都是比較費時的操作,因此可以將session保存在快取中,例如memcached 或redis中,


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


使用快取還有個好處就是,通常session有一定得存活時間,如果存在資料庫中,還需要保存該session的存活時間,在取出session時,還需要判斷其是否失效。


使用緩存存放session就可以在存放的時候設定其存活時間,減少了取出後的失效判斷這一過程。

我的解決方法是在入口出新增以下程式碼:

ini_set('session.cookie_path', '/');
 
 ini_set('session.cookie_domain', '.jb51.net'); //注意jb51.net换成你自己的域名
 
ini_set('session.cookie_lifetime', '1800');
登入後複製
   

如圖:

站點一

PHP中session跨子域的三種實作方法

站點一

🎜🎜

PHP中session跨子域的三種實作方法

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

以上就是在PHP中session實現跨子域的幾種解決方案,希望能幫助到有需要的大家。

更多PHP中session跨子域的三種實作方法相關文章請關注PHP中文網!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24