實現多域名下共用一個SESSION

巴扎黑
發布: 2016-11-24 09:13:16
原創
1764 人瀏覽過

要實現多域名共享session,首先就得了解SESSION的運作機制。基本概念我就不說了。
session是這樣運作的:
用戶A訪問站點Y,如果站點Y執行了session_start();(以下假定session_start()總是存在)那麼會產生一個session_id,這個session id一般會以COOKIE的形式保存到使用者A(我們可以透過在php.ini裡設定session.use_only_cookies為1,強制SESSION ID必須以COOKIE傳遞。)。這時候SESSION ID表現為$_COOKIE['PHPSESSID'];(PHPSESSID可用session_name()函數來修改)
用戶A接著訪問,這個session id($_COOKIE['PHPSESSID'])就會在A每次訪問Y的時候傳送到站點Y。
在站點Y上,會有這麼一個目錄,是用來保存SESSION的實際資料的。站點Y接收到session id,然後透過session id,來獲得與SESSION資料的關聯,並傳回SESSION資料。

可能聰明的你已經想到了,既然伺服器端和客戶端之間的SESSION是透過一個SESSION ID來聯繫,並且SESSION資料是以普通檔案的形式保存在一個特定的資料夾裡。
那麼我們要實現不同域名,只需要滿足以下兩個條件:

1)不同域名的SESSION資料目錄統一到一起,或是同步更新。

2)對同一個客戶,使用統一的一個SESSION ID

第一個條件的實作。
如果是同一台伺服器,就不需要進行任何設定了。
如果是群集/分散式的,那我想也不需要我來說了。 。能做分散式應用的,在目錄分享的經驗應該比我豐富。我也沒有進行過多伺服器的測試,主客觀條件的原因都有。

我在這裡主要是想說第二個條件——使不同的域名,擁有統一的SESSION ID。
那我們該怎麼統一呢?
首先必須在不同網域之間傳遞這個SESSION ID,且由於 cookie必須是針對網域的,所以傳遞動作是由客戶端來完成。如果傳遞過程不是由客戶端來完成,那麼接受傳遞的網域就不知道針對的是哪個客戶。

其次就是修改接受傳遞的網域下的SESSION ID。

如何傳遞:
HTML裡,我們可以使用很多種方法。例如
iframe

或.js

或是一個img html元素
實現多域名下共用一個SESSION
只要能呼叫某個地址,就行。

在wml裡,由於wml script的特點,我們無法使用script這樣的形式來調用,而wml裡也沒iframe..但是我們還是可以通過img來實現傳遞的。

如何修改:
既然SESSION ID一般情況下是透過COOKIE來傳遞,那麼我們只需要透過傳遞$_COOKIE['PHPSESSID'];即可。但如果PHPSESSID被session_name改變了,我們又得修改setcookie中的PHPSESSID..這樣就會變得很麻煩。 。所以我們可以選擇一個session特有的函數session_id來修改$_COOKIE['PHPSESSID'];

需要注意的幾點:

如果session.use_only_cookies為0(PHP預設),那麼session id有可能會以url或url其他形式傳遞

session_id()和session_name必須在session_start()前使用

以下是我寫的一個簡單的實現多域名的類別。如果上面的看不太明白,可以看看我的這個多網域類別。這個類別是在HTML下以iframe形式實作的。

 

/*

使用:
伺服器A,伺服器B,在A的index.php登陸,在B裡建立一個接收SESSION的文件,例如ses_get.php
A的index.php做如下修改
最修改
開始加上session_start();

裡,任一地方寫上:mdSession::_set('B/ses_get.php')
而ses_get.php則在開頭寫mdSession::_get ();
@作者:surfchen@gmail.com http://www.surfchen.org/ */
function mdSession()
{

} 函數!is_array($urls))
{ $urls=array($urls); } foreach ($urls as $value)
{ echo ''; } return true; } function get()
{ session_id($_SERVER['QUERY_STRING']); session_start( ); return true; } function _set($urls)
{ $obj=new mdSession(); return $obj->set($urls); } function _get()
{ $obj=new mdSession(); return $ obj->get(); }
}?>

 

index.php :

  include "mdSession.php";

  include "mdSession.php";

  include "mdSession。 ']="yogurt8";

mdSession::_set('http://www.b.com/ses_get.php');

var_dump($_SESSION);

?>

 

.

 include "mdSession.php";

mdSession::_get();

?>

 

b.php 或ION);

 

先訪問http://www.a.com/a.php 然後在http://www.b.com/b.php 看效果

 

在firefox 與Google瀏覽器是沒問題,Google瀏覽器是沒問題,但在Ie 下還是不行

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!