常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。  
方式一:  
    在一,二级域名下调用如下代码:      
<?php      
    include("DBsession.php");      
    $_SESSION['usssser_oke'] = 'xxssssss';      
    $_SESSION['user_oke'] = 'xxsss';        
?>    
  
  
DBsession.php  
  
  
    <?php      
    /**   
       
    /**  直接引用api QQ登录的session写法,配置相关配置才行哈 
     * 设置session配置    
     */      
          
    /**   
     * CREATE TABLE `tbl_session` (   
     *     `session_id` varchar(255) binary NOT NULL default '',   
     *     `session_expires` int(10) unsigned NOT NULL default '0',   
     *     `session_data` text,   
     *     PRIMARY KEY  (`session_id`)   
     *    ) ENGINE=MyISAM;   
     */      
          
    class Session       
    {      
        //mysql的主机地址      
        const db_host = "localhost"; //需要第三方指定ip地址       
          
        //数据库用户名      
        const db_user = "root";   //需要第三方指定自己的用户名      
          
        //数据库密码      
        const db_pwd = ""; //需要第三方指定自己的库据库密码      
          
        //数据库      
        const db_name = "thinkphp";      //需要第三方指定数据库      
          
        //数据库表      
        const db_table = "tbl_session"; //需要第三方指定数据表      
          
        //mysql-handle      
        private $db_handle;      
          
        //session-lifetime      
        private $lifeTime;      
          
        function open($savePath, $sessName)       
        {      
            // get session-lifetime      
            $this->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);      
    }      
          
    /**   
     * 同一个主域名,不同服务器之间共享session信息   
     * USER_SESSION = false 禁用该功能   
     * USER_SESSION = true  启用该功能   
     * 默认禁止   
     * 开启前提需要建立mysql数据表   
     */      
     ini_set('session.name', 'phpsessid');//设置色session id的名字      
    define("USER_SESSION", true);      
    if (defined("USER_SESSION") && USER_SESSION)      
    {      
        @ini_set("session.save_handler", "user");      
        $session = new Session;      
        @session_module_name("user");      
        @session_set_save_handler(      
            array(&$session, "open"),      
            array(&$session, "close"),      
            array(&$session, "read"),      
            array(&$session, "write"),      
            array(&$session, "destroy"),      
            array(&$session, "gc"));      
    }      
    //@ini_set("session.save_path", dirname(__file__)."/tmp");      
    //@session_id("demo");      
    //ini_set("session.save_path",dirname(__file__)."/tmp");      
    session_start();  
    include("DBsession.php");      
    $_SESSION['usssser_oke'] = 'xxssssss';      
    $_SESSION['user_oke'] = 'xxsss';       
    ?>     
  
  
方式二:  
PHP Code复制内容到剪贴板  
  
    <?php    
    ini_set('session.name', 'sid');//设置色session id的名字    
    ini_set('session.use_trans_sid', 0);//不使用 GET/POST 变量方式    
    ini_set('session.use_cookies', 1);//使用 COOKIE 保存 SESSION ID 的方式    
    ini_set('session.cookie_path', '/');    
    ini_set('session.cookie_domain', '.ichezone.com');//多主机共享保存 SESSION ID 的 COOKIE,注意此处域名为一级域名    
    session_start();    
    $_SESSION['usssser_oke'] = 'xxssssss';    
    $_SESSION['user_oke'] = 'xxsss';      
    ?>    
  
第三种方式:  
PHP Code复制内容到剪贴板  
  
    一级域名:    
    session_start();    
    setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".ichezone.com");    
     $_SESSION['user_name'] = '梁山良民';    
    二级域名:    
    session_id($_COOKIE['session_id']);    
    session_start();    
    $_SESSION['user_sssme'] = 222222;    
  
第四种方式:  
PHP Code复制内容到剪贴板  
  
    一级域名:    
    ini_set("session.cookie_domain",'.ichezone.com');//注:该参数必须在sesson_start()之上,否则将不会生效    
    session_start();    
    $_SESSION['user_name'] = '梁山www良民';    
    二级域名:    
    ini_set("session.cookie_domain",'.ichezone.com');//注:该参数必须在sesson_start()之上,否则将不会生效    
    session_start();    
    $_SESSION['user_nassse'] = '梁山www良民';     
  
第五种方式:  
  
采用的p3p技术,实现原理,在访问网站x.com的时候,y.com程序触发y.com文件的写入sessionid值,sessionid值便可以获取,然后把seesion值存入数据库,取相同的sessionid值便可。这就要求y.com里面的程序文件必需能跨域访问,默认情况下,浏览器是不能跨域设置cookie的,加上p3p头后才行。在对应php文件加上:  
   
PHP Code复制内容到剪贴板  
  
    header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');     
  
  
   
  
这里直接引用网上的一篇博文了:  
  
    127.0.0.1        www.a.com    
    127.0.0.1        www.b.com    
        
    首先:创建 a_setcookie.php 文件,内容如下:    
        
    <?php    
    header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');    
    setcookie("test", $_GET['id'], time()+3600, "/", ".a.com");    
    ?>    
        
    然后:创建 a_getcookie.php 文件,内容如下:    
        
    <?php    
    var_dump($_COOKIE);    
    ?>    
        
    最后:创建 b_setcookie.php 文件,内容如下:    
        
    <script src="http://www.a.com/a_setcookie.php?id=www.b.com"></script>    
        
    ----------------------------    
        
    三个文件创建完毕后,我们通过浏览器依次访问:    
        
    http://www.b.com/b_setcookie.php    
    http://www.a.com/a_getcookie.php    
        
    我们会发现,在访问b.com域的时候,我们并没有在a.com域设置上cookie值。去掉重新访问两文件设置成功