本篇文章為大家展示了如何在PHP中利用session實現(xiàn)跨子域,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Session主要分兩部分:
一個是Session數(shù)據(jù),該數(shù)據(jù)默認情況下是存放在服務器的tmp文件下的,是以文件形式存在。
另一個是標志著Session數(shù)據(jù)的Session Id,Session ID
,就是那個 Session 文件的文件名,Session ID
是隨機生成的,因此能保證性和隨機性,確保 Session 的安全。一般如果沒有設置 Session 的生存周期,則Session ID
存儲在內(nèi)存中,關閉瀏覽器后該 ID 自動注銷,重新請求該頁面后,重新注冊一個session ID
。如果客戶端沒有禁用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是存儲Session ID
和Session 生存期
的角色。
兩個不同的域名網(wǎng)站,想用同一個Session,就是牽扯到Session跨域問題!
默認情況下,各個服務器會各自分別對同一個客戶端產(chǎn)生SESSIONID
,如對于同一個用戶瀏覽器,A 服務器產(chǎn)生的SESSION ID
是 11111111111,而B 服務器生成的則是222222。另外,PHP 的 SESSION數(shù)據(jù)都是分別保存在本服務器的文件系統(tǒng)中。想要共享 SESSION 數(shù)據(jù),那就必須實現(xiàn)兩個目標:
一個是各個服務器對同一個客戶端產(chǎn)生的SESSION ID
必須相同,并且可通過同一個 COOKIE 進行傳遞,也就是說各個服務器必須可以讀取同一個名為PHPSESSID
的COOKIE;
另一個是 SESSION 數(shù)據(jù)的存儲方式/位置必須保證各個服務器都能夠訪問到。這兩個目標簡單地說就是多服務器(A、B服務器)共享客戶端的SESSION ID
,同時還必須共享服務器端的 SESSION 數(shù)據(jù)。
有三種解決方法:
1.只要在php頁面的最開始(要在任何輸出之前,并且在session_start()之前)的地方進行以下設置
ini_set('session.cookie_path', '/'); ini_set('session.cookie_domain', '.mydomain.com'); ini_set('session.cookie_lifetime', '1800');
2.在php.ini里設置
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都是保存在服務器端,如何讓兩臺服務器識別這兩個請求是由一個瀏覽器發(fā)出的呢?
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是一個數(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就可以在存放的時候設置其存活時間,減少了取出后的失效判斷這一個過程。
我的解決方法是在入口出添加如下代碼:
ini_set('session.cookie_path', '/'); ini_set('session.cookie_domain', '.jb51.net'); //注意jb51.net換成你自己的域名 ini_set('session.cookie_lifetime', '1800');
如圖:
站點一
站點二
可以看到兩個站點的PHPSESSID
是一樣的,當然也解決了跨子域名的問題了
上述內(nèi)容就是如何在PHP中利用session實現(xiàn)跨子域,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文題目:如何在PHP中利用session實現(xiàn)跨子域-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://aaarwkj.com/article10/dohigo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站設計公司、定制網(wǎng)站、標簽優(yōu)化、關鍵詞優(yōu)化、營銷型網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)