1. 程式人生 > >處理session跨域幾種的方案

處理session跨域幾種的方案

常用跨域共用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值。去掉重新訪問兩檔案設定成功