处理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); }

标签: