当前位置:编程学习 > > 正文

php实现无cookie的session(php实现多站点共用session实现单点登录的方法详解)

时间:2021-10-21 07:14:53类别:编程学习

php实现无cookie的session

php实现多站点共用session实现单点登录的方法详解

本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下:

最近闲来无事,总结整理下单点登录的问题。

单点登录的基本原理为:客户端共享sesionid,服务器端共享session信息。通过共同的sessionid在服务器端获得相同session信息,即可达到单点登录(即多站点共享用户信息,一处登录,处处可用)的目的。

单点登录分为两种情况:

一、站点部署在同一个服务器,且使用同一个二级域名

这种情况下,比较好解决。

1、首先解决站点在客户端sessionid(存在cookie中)的共享问题。使用ini_set()函数即可指定cookie的域,如下: ini_set('session.cookie_domain', '.xxxx.com');//设置服务器cookie的域,xxxx为公用二级域名

2、其次解决站点在服务端的session信息的共享。因为站点在同一个服务器,所以生成的session文件是可以公用的,可以直接使用sessionid获取对应的session信息。

二、站点部署在不同的服务器,使用不同域名

这种情况比较复杂,因为站点在不同服务器使用不同域名,在客户端不能使用ini_set设置cookie的作用域,在服务器端也是各自生成自己的session文件,不能共用,但还是用解决的办法。

1、首先解决客户端sessionid同步问题。

假设我们有三个站点,域名分别是aa.com,bb.com,cc.com。我们在aa.com上建立一个共用的登陆入口login.php,三个网站的登陆请求全部跳转到该页面。代码流程如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • $back = login($name,$pwd);//执行登陆操作,成功就写入session
  • //如果登录成功,进行以下操作流程
  • if($back){
  •   $sessionid = session_id();
  •   $key = encode($session,$keyword);//生成安全码
  •   //输出一个登陆成功提示页,并跳转到请求登陆的站点
  • }
  • 在登陆成功html提示页面中添加如下代码,利用iframe标签请求需要同步登陆的站点

    php实现无cookie的session(php实现多站点共用session实现单点登录的方法详解)

    aa.com和cc.com站点的set_cookie.php文件如下

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • //解密$key
  • decode($key);
  • //把当前站点的sessionid设置为传递的sessionid
  • session_id($_GET['sessionid']);
  • session_start();
  • 2、解决三个站点服务器端共享session的问题。

    前面已经说过,因为三个站点不在同一个服务器,因此会生成各自的session文件,如果想要共享这些文件,又面临跨域等一系列问题。所以我们转化思路,不使用文件保存session信息,而是把session信息保存到数据库中。这样,只要获得session信息的sessionid,任何站点都可以访问相同的session信息。

    我们创建一个mysql_session.php文件,用于存储session信息到数据库,代码如下

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • $gb_DBname="test";            //数据库名称
  • $gb_DBuser="root";            //数据库用户名称
  • $gb_DBpass="";              //数据库密码
  • $gb_DBHOSTname="127.0.0.1";        //主机的名称或是IP地址
  • $SESS_DBH="";              //数据库对象
  • session_module_name("User");      //定义session存储按用户定义的方式
  • $SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//得到session的最大有效期,也可以自定义
  • function sess_open($save_path,$session_name)
  • {
  •   global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH;
  •   if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
  •   echo "MySql Error:".mysql_error()."";
  •   die();
  •   }
  •   if(!mysql_select_db($gb_DBname,$SESS_DBH)){
  •   echo "MySql Error:".mysql_error()."";
  •   die();
  •   }
  •   return true;
  • }
  • function sess_close(){
  • return true;
  • }
  • function sess_read($key)
  • {
  •   global $SESS_DBH,$SESS_LIFE;
  •   $qry="select value from db_session where sesskey = '$key' and expiry > ".time();
  •   $qid=mysql_query($qry,$SESS_DBH);
  •   if(list($value)=mysql_fetch_row($qid)){
  •   return $value;
  •   }
  •   return false;
  • }
  • //写入session信息。保存session信息的数据表名为:db_session
  • //除了主键自增id,需要的字段如下
  • //sesskey  sessionid
  • //values  session值
  • //expiry  session的到期日期
  • function sess_write($key,$val)
  • {
  •   global $SESS_DBH,$SESS_LIFE;
  •   $expiry=time()+$SESS_LIFE;
  •   $value=$val;
  •   $qry="insert into db_session values('$key',$expiry,'$value')";
  •   $qid=mysql_query($qry,$SESS_DBH);
  •   if(!$qid){
  •   $qry="update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >".time();
  •   $qid=mysql_query($qry,$SESS_DBH);
  •   }
  •   return $qid;
  • }
  • function sess_destroy($key)
  • {
  •   global $SESS_DBH;
  •   $qry="delete from db_session where sesskey = '$key'";
  •   $qid=mysql_query($qry,$SESS_DBH);
  •   return $qid;
  • }
  • function sess_gc($maxlifetime)
  • {
  •   global $SESS_DBH;
  •   $qry="delete from db_session where expiry < ".time();
  •   $qid=mysql_query($qry,$SESS_DBH);
  •   return mysql_affected_rows($SESS_DBH);
  • }
  • session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc");
  • 之后在需要使用session的页面中,在session_start()之前引入该文件,其他的跟平时使用seesion一样就可以了。你会发现你赋值的session已经被存进了数据库中。

    希望本文所述对大家PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/u012830303/article/details/82252708

    上一篇下一篇

    猜您喜欢

    热门推荐