處理session跨域幾種方案
處理session 跨域幾種方案1. 訪問(wèn)共同的sessionId, 把當(dāng)前的sessionId 寫(xiě)進(jìn)cookie 里面cookie 在不同域名下是不能訪問(wèn)的,我們需要在訪問(wèn)在后臺(tái)設(shè)置用戶在登錄的時(shí)候
處理session 跨域幾種方案
1. 訪問(wèn)共同的sessionId, 把當(dāng)前的sessionId 寫(xiě)進(jìn)cookie 里面
cookie 在不同域名下是不能訪問(wèn)的,我們需要在訪問(wèn)在后臺(tái)設(shè)置用戶在登錄的時(shí)候,把需要共用的登錄信息的域名,如果是在1,2級(jí)域名下,直接把 cookie 設(shè)置為所屬主域名,例如:setcookie("session_id",session_id(),time() 3600*24*365*10,"/",".a.com");
也許你會(huì)問(wèn):如果是在不同的域名呢?采用P3P 技術(shù)簡(jiǎn)單解決,實(shí)現(xiàn)原理,在訪問(wèn)網(wǎng)站x.com 的時(shí)候,y.com 程序觸發(fā)y.com 文件的寫(xiě)入 sessionid 值,sessionid 值便可以獲取,然后把seesion 值存入數(shù)據(jù)庫(kù),取相同的sessionid 值便可。這就要求y.com 里面的程序文件必需能跨域訪問(wèn), 默認(rèn)情況下,瀏覽器是不能跨域設(shè)置cookie 的,加上p3p 頭后才行。在對(duì)應(yīng)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 數(shù)據(jù)存儲(chǔ)位置一致的實(shí)現(xiàn)方法
session 該數(shù)據(jù)默認(rèn)情況下是存放在服務(wù)器的tmp 文件下的,是以文件形式存在,而非存儲(chǔ)在服務(wù)器的內(nèi)存中,在這里我們得修改為所有域下都能訪問(wèn)的方式。網(wǎng)上介紹了數(shù)據(jù)庫(kù)存儲(chǔ),文件形式存儲(chǔ),內(nèi)存存儲(chǔ), 如果用數(shù)據(jù)庫(kù)存儲(chǔ)session 數(shù)據(jù),網(wǎng)站的訪問(wèn)量很大的話,SESSION 的讀寫(xiě)會(huì)頻繁地對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,效率就會(huì)明顯降低,可以考慮存在內(nèi)存服務(wù)器來(lái)實(shí)現(xiàn),下面的session.rar 里面介紹的是數(shù)據(jù)庫(kù)存session 的實(shí)例。
,常用跨域共用session 的是登錄模塊,我相信很多開(kāi)發(fā)的朋友的都遇到過(guò),只需要一個(gè)地方登錄,相關(guān)聯(lián)的網(wǎng)站也是處于登錄狀態(tài)。兩種情況:一種9streets.cn 和a.9streets.cn 之間,另一種是a.com b.com 之間
方式一: 在一,二級(jí)域名下調(diào)用如下代碼:
DBsession.php
lifeTime = get_cfg_var("session.gc_maxlifetime");
// open database-connection
$db_handle = @mysql_connect(self::db_host, self::db_user, self::db_pwd); $dbSel = @mysql_select_db(self::db_name, $db_handle);
// return success
if(!$db_handle || !$dbSel)
return false;
,$this->db_handle = $db_handle;
return true;
}
function close()
{
$this->gc(ini_get('session.gc_maxlifetime'));
// close database-connection
return @mysql_close($this->db_handle);
}
function read($sessID)
{
// fetch session-data
$res = @mysql_query("SELECT session_data AS d FROM ".self::db_table." WHERE session_id = '$sessID'
AND session_expires > ".time(), $this->db_handle);
// return data or an empty string at failure
,if($row = @mysql_fetch_assoc($res))
return $row['d'];
return "";
}
function write($sessID, $sessData)
{
// new session-expire-time
$newExp = time() $this->lifeTime;
// is a session with this id in the database?
$res = @mysql_query("SELECT * FROM ".self::db_table." WHERE session_id = '$sessID'", $this->db_handle); // if yes,
if(@mysql_num_rows($res))
{
// ...update session-data
@mysql_query("UPDATE ".self::db_table."
,SET session_expires = '$newExp',
session_data = '$sessData'
WHERE session_id = '$sessID'", $this->db_handle); // if something happened, return true
if(@mysql_affected_rows($this->db_handle)) return true;
}
else // if no session-data was found,
{
// create a new row
@mysql_query("INSERT INTO ".self::db_table." ( session_id,
session_expires,
session_data)
VALUES(
'$sessID',
,'$newExp',
'$sessData')", $this->db_handle);
// if row was created, return true
if(@mysql_affected_rows($this->db_handle))
return true;
}
// an unknown error occured
return false;
}
function destroy($sessID)
{
// delete session-data
@mysql_query("DELETE FROM ".self::db_table." WHERE session_id = '$sessID'", $this->db_handle);
// if session was deleted, return true,
if(@mysql_affected_rows($this->db_handle))
,return true;
// ...else return false
return false;
}
function gc($sessMaxLifeTime)
{
// delete old sessions
@mysql_query("DELETE FROM ".self::db_table." WHERE session_expires < ".time(), $this->db_handle);
// return affected rows
return @mysql_affected_rows($this->db_handle);
}
}
/**
* 指定session 有效的域名
* ini_set("session.cookie_domain", ".domain.com");
,* .domain.com是站點(diǎn)的主域名, 請(qǐng)注意前面?zhèn)€有一個(gè)'.' */
define("MAIN_DOMAIN", ".ichezone.com"); //設(shè)置主域名 /**
* 不同子域名下共享session 信息
* COOKIE_DOMAIN = false 禁止該功能
* COOKIE_DOMAIN = true 啟用該功能
* 默認(rèn)禁止
* 開(kāi)啟前提需要定義MAIN_DOMAIN常量
*/
define("COOKIE_DOMAIN", true);
if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN) {
if (defined("MAIN_DOMAIN"))
@ini_set("session.cookie_domain", MAIN_DOMAIN); }