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.         

  1.     我们会发现,在访问b.com域的时候,我们并没有在a.com域设置上cookie值。去掉重新访问两文件设置成功  


原文来自:http://tw5566.iteye.com/blog/1945825

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值