处理session跨域几种方案
处理session 跨域几种方案1. 访问共同的sessionId, 把当前的sessionId 写进cookie 里面cookie 在不同域名下是不能访问的,我们需要在访问在后台设置用户在登录的时候
处理session 跨域几种方案
1. 访问共同的sessionId, 把当前的sessionId 写进cookie 里面
cookie 在不同域名下是不能访问的,我们需要在访问在后台设置用户在登录的时候,把需要共用的登录信息的域名,如果是在1,2级域名下,直接把 cookie 设置为所属主域名,例如:setcookie("session_id",session_id(),time() 3600*24*365*10,"/",".a.com");
也许你会问:如果是在不同的域名呢?采用P3P 技术简单解决,实现原理,在访问网站x.com 的时候,y.com 程序触发y.com 文件的写入 sessionid 值,sessionid 值便可以获取,然后把seesion 值存入数据库,取相同的sessionid 值便可。这就要求y.com 里面的程序文件必需能跨域访问, 默认情况下,浏览器是不能跨域设置cookie 的,加上p3p 头后才行。在对应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 数据存储位置一致的实现方法
session 该数据默认情况下是存放在服务器的tmp 文件下的,是以文件形式存在,而非存储在服务器的内存中,在这里我们得修改为所有域下都能访问的方式。网上介绍了数据库存储,文件形式存储,内存存储, 如果用数据库存储session 数据,网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,效率就会明显降低,可以考虑存在内存服务器来实现,下面的session.rar 里面介绍的是数据库存session 的实例。
,常用跨域共用session 的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn 和a.9streets.cn 之间,另一种是a.com b.com 之间
方式一: 在一,二级域名下调用如下代码:
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是站点的主域名, 请注意前面个有一个'.' */
define("MAIN_DOMAIN", ".ichezone.com"); //设置主域名 /**
* 不同子域名下共享session 信息
* COOKIE_DOMAIN = false 禁止该功能
* COOKIE_DOMAIN = true 启用该功能
* 默认禁止
* 开启前提需要定义MAIN_DOMAIN常量
*/
define("COOKIE_DOMAIN", true);
if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN) {
if (defined("MAIN_DOMAIN"))
@ini_set("session.cookie_domain", MAIN_DOMAIN); }