處理session跨域幾種的方案

  1. 常用跨域共用session的是登錄模塊,我相信很多開發的朋友的都遇到過,只需要一個地方登錄,相關聯的網站也是處於登錄狀態。兩種情況:一種9streets.cn和a.9streets.cn之間,另一種是a.com b.com之間,這幾天總結了一下處理方法。  
  2. 方式一:  
  3.     在一,二級域名下調用如下代碼:      
  4. <?php      
  5.     include("DBsession.php");      
  6.     $_SESSION['usssser_oke'] = 'xxssssss';      
  7.     $_SESSION['user_oke'] = 'xxsss';        
  8. ?>    
  9.   
  10.   
  11. DBsession.php  
  12.   
  13.   
  14.     <?php      
  15.     /**   
  16.        
  17.     /**  直接引用api QQ登錄的session寫法,配置相關配置才行哈 
  18.      * 設置session配置    
  19.      */      
  20.           
  21.     /**   
  22.      * CREATE TABLE `tbl_session` (   
  23.      *     `session_id` varchar(255) binary NOT NULL default '',   
  24.      *     `session_expires` int(10) unsigned NOT NULL default '0',   
  25.      *     `session_data` text,   
  26.      *     PRIMARY KEY  (`session_id`)   
  27.      *    ) ENGINE=MyISAM;   
  28.      */      
  29.           
  30.     class Session       
  31.     {      
  32.         //mysql的主機地址      
  33.         const db_host = "localhost"//需要第三方指定ip地址       
  34.           
  35.         //數據庫用戶名      
  36.         const db_user = "root";   //需要第三方指定自己的用戶名      
  37.           
  38.         //數據庫密碼      
  39.         const db_pwd = ""//需要第三方指定自己的庫據庫密碼      
  40.           
  41.         //數據庫      
  42.         const db_name = "thinkphp";      //需要第三方指定數據庫      
  43.           
  44.         //數據庫表      
  45.         const db_table = "tbl_session"//需要第三方指定數據表      
  46.           
  47.         //mysql-handle      
  48.         private $db_handle;      
  49.           
  50.         //session-lifetime      
  51.         private $lifeTime;      
  52.           
  53.         function open($savePath$sessName)       
  54.         {      
  55.             // get session-lifetime      
  56.             $this->lifeTime = get_cfg_var("session.gc_maxlifetime");      
  57.           
  58.             // open database-connection      
  59.             $db_handle = @mysql_connect(self::db_host, self::db_user, self::db_pwd);      
  60.           
  61.             $dbSel = @mysql_select_db(self::db_name, $db_handle);      
  62.           
  63.             // return success      
  64.             if(!$db_handle || !$dbSel)      
  65.                 return false;      
  66.           
  67.             $this->db_handle = $db_handle;      
  68.             return true;      
  69.         }      
  70.           
  71.         function close()       
  72.         {      
  73.             $this->gc(ini_get('session.gc_maxlifetime'));      
  74.             // close database-connection      
  75.             return @mysql_close($this->db_handle);      
  76.         }      
  77.           
  78.         function read($sessID)       
  79.         {      
  80.             // fetch session-data      
  81.             $res = @mysql_query("SELECT session_data AS d FROM ".self::db_table."     
  82.                 WHERE session_id = '$sessID'    
  83.                 AND session_expires > ".time(), $this->db_handle);      
  84.           
  85.             // return data or an empty string at failure      
  86.             if($row = @mysql_fetch_assoc($res))      
  87.                 return $row['d'];      
  88.           
  89.             return "";      
  90.         }      
  91.           
  92.         function write($sessID$sessData)       
  93.         {      
  94.             // new session-expire-time      
  95.             $newExp = time() + $this->lifeTime;      
  96.           
  97.             // is a session with this id in the database?      
  98.             $res = @mysql_query("SELECT * FROM ".self::db_table."     
  99.                 WHERE session_id = '$sessID'", $this->db_handle);      
  100.           
  101.             // if yes,      
  102.             if(@mysql_num_rows($res))       
  103.             {      
  104.                 // ...update session-data      
  105.                 @mysql_query("UPDATE ".self::db_table."     
  106.                     SET session_expires = '$newExp',    
  107.                     session_data = '$sessData'    
  108.                     WHERE session_id = '$sessID'", $this->db_handle);      
  109.           
  110.                 // if something happened, return true      
  111.                 if(@mysql_affected_rows($this->db_handle))      
  112.                     return true;      
  113.             }      
  114.             else // if no session-data was found,      
  115.             {      
  116.                 // create a new row      
  117.                 @mysql_query("INSERT INTO ".self::db_table." (    
  118.                     session_id,    
  119.                     session_expires,    
  120.                     session_data)    
  121.                     VALUES(    
  122.                         '$sessID',    
  123.                         '$newExp',    
  124.                         '$sessData')", $this->db_handle);      
  125.                 // if row was created, return true      
  126.                 if(@mysql_affected_rows($this->db_handle))      
  127.                     return true;      
  128.             }      
  129.           
  130.             // an unknown error occured      
  131.             return false;      
  132.         }      
  133.           
  134.         function destroy($sessID)       
  135.         {      
  136.             // delete session-data      
  137.             @mysql_query("DELETE FROM ".self::db_table." WHERE session_id = '$sessID'"$this->db_handle);      
  138.           
  139.             // if session was deleted, return true,      
  140.             if(@mysql_affected_rows($this->db_handle))      
  141.                 return true;      
  142.           
  143.             // ...else return false      
  144.             return false;      
  145.         }      
  146.           
  147.         function gc($sessMaxLifeTime)       
  148.         {      
  149.             // delete old sessions      
  150.             @mysql_query("DELETE FROM ".self::db_table." WHERE session_expires < ".time(), $this->db_handle);      
  151.           
  152.             // return affected rows      
  153.             return @mysql_affected_rows($this->db_handle);      
  154.         }      
  155.     }      
  156.           
  157.     /**   
  158.      * 指定session有效的域名   
  159.      * ini_set("session.cookie_domain", ".domain.com");   
  160.      * .domain.com是站點的主域名,請注意前面個有一個'.'   
  161.      */      
  162.     define("MAIN_DOMAIN"".ichezone.com");   //設置主域名      
  163.           
  164.     /**   
  165.      * 不同子域名下共享session信息   
  166.      * COOKIE_DOMAIN = false 禁止該功能   
  167.      * COOKIE_DOMAIN = true  啓用該功能   
  168.      * 默認禁止   
  169.      * 開啓前提需要定義MAIN_DOMAIN常量   
  170.      */      
  171.     define("COOKIE_DOMAIN", true);       
  172.     if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN)      
  173.     {      
  174.         if (defined("MAIN_DOMAIN"))      
  175.             @ini_set("session.cookie_domain", MAIN_DOMAIN);      
  176.     }      
  177.           
  178.     /**   
  179.      * 同一個主域名,不同服務器之間共享session信息   
  180.      * USER_SESSION = false 禁用該功能   
  181.      * USER_SESSION = true  啓用該功能   
  182.      * 默認禁止   
  183.      * 開啓前提需要建立mysql數據表   
  184.      */      
  185.      ini_set('session.name''phpsessid');//設置色session id的名字      
  186.     define("USER_SESSION", true);      
  187.     if (defined("USER_SESSION") && USER_SESSION)      
  188.     {      
  189.         @ini_set("session.save_handler""user");      
  190.         $session = new Session;      
  191.         @session_module_name("user");      
  192.         @session_set_save_handler(      
  193.             array(&$session"open"),      
  194.             array(&$session"close"),      
  195.             array(&$session"read"),      
  196.             array(&$session"write"),      
  197.             array(&$session"destroy"),      
  198.             array(&$session"gc"));      
  199.     }      
  200.     //@ini_set("session.save_path", dirname(__file__)."/tmp");      
  201.     //@session_id("demo");      
  202.     //ini_set("session.save_path",dirname(__file__)."/tmp");      
  203.     session_start();  
  204.     include("DBsession.php");      
  205.     $_SESSION['usssser_oke'] = 'xxssssss';      
  206.     $_SESSION['user_oke'] = 'xxsss';       
  207.     ?>     
  208.   
  209.   
  210. 方式二:  
  211. PHP Code複製內容到剪貼板  
  212.   
  213.     <?php    
  214.     ini_set('session.name''sid');//設置色session id的名字    
  215.     ini_set('session.use_trans_sid', 0);//不使用 GET/POST 變量方式    
  216.     ini_set('session.use_cookies', 1);//使用 COOKIE 保存 SESSION ID 的方式    
  217.     ini_set('session.cookie_path''/');    
  218.     ini_set('session.cookie_domain''.ichezone.com');//多主機共享保存 SESSION ID 的 COOKIE,注意此處域名爲一級域名    
  219.     session_start();    
  220.     $_SESSION['usssser_oke'] = 'xxssssss';    
  221.     $_SESSION['user_oke'] = 'xxsss';      
  222.     ?>    
  223.   
  224. 第三種方式:  
  225. PHP Code複製內容到剪貼板  
  226.   
  227.     一級域名:    
  228.     session_start();    
  229.     setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".ichezone.com");    
  230.      $_SESSION['user_name'] = '梁山良民';    
  231.     二級域名:    
  232.     session_id($_COOKIE['session_id']);    
  233.     session_start();    
  234.     $_SESSION['user_sssme'] = 222222;    
  235.   
  236. 第四種方式:  
  237. PHP Code複製內容到剪貼板  
  238.   
  239.     一級域名:    
  240.     ini_set("session.cookie_domain",'.ichezone.com');//注:該參數必須在sesson_start()之上,否則將不會生效    
  241.     session_start();    
  242.     $_SESSION['user_name'] = '梁山www良民';    
  243.     二級域名:    
  244.     ini_set("session.cookie_domain",'.ichezone.com');//注:該參數必須在sesson_start()之上,否則將不會生效    
  245.     session_start();    
  246.     $_SESSION['user_nassse'] = '梁山www良民';     
  247.   
  248. 第五種方式:  
  249.   
  250. 採用的p3p技術,實現原理,在訪問網站x.com的時候,y.com程序觸發y.com文件的寫入sessionid值,sessionid值便可以獲取,然後把seesion值存入數據庫,取相同的sessionid值便可。這就要求y.com裏面的程序文件必需能跨域訪問,默認情況下,瀏覽器是不能跨域設置cookie的,加上p3p頭後才行。在對應php文件加上:  
  251.    
  252. PHP Code複製內容到剪貼板  
  253.   
  254.     header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');     
  255.   
  256.   
  257.    
  258.   
  259. 這裏直接引用網上的一篇博文了:  
  260.   
  261.     127.0.0.1        www.a.com    
  262.     127.0.0.1        www.b.com    
  263.         
  264.     首先:創建 a_setcookie.php 文件,內容如下:    
  265.         
  266.     <?php    
  267.     header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');    
  268.     setcookie("test"$_GET['id'], time()+3600, "/"".a.com");    
  269.     ?>    
  270.         
  271.     然後:創建 a_getcookie.php 文件,內容如下:    
  272.         
  273.     <?php    
  274.     var_dump($_COOKIE);    
  275.     ?>    
  276.         
  277.     最後:創建 b_setcookie.php 文件,內容如下:    
  278.         
  279.     <script src="http://www.a.com/a_setcookie.php?id=www.b.com"></script>    
  280.         
  281.     ----------------------------    
  282.         
  283.     三個文件創建完畢後,我們通過瀏覽器依次訪問:    
  284.         
  285.     http://www.b.com/b_setcookie.php    
  286.     http://www.a.com/a_getcookie.php    
  287.         
  288.     我們會發現,在訪問b.com域的時候,我們並沒有在a.com域設置上cookie值。去掉重新訪問兩文件設置成功   
  289.   
  290.    

  參見:http://www.9streets.cn/art-php-578.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章