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

 更新时间:2019年09月18日 11:22:27   作者:whynogome  
这篇文章主要介绍了php实现多站点共用session实现单点登录的方法,结合实例形式详细分析了php多站点共用seeion实现单点登录相关原理及操作注意事项,需要的朋友可以参考下

本文实例讲述了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,三个网站的登陆请求全部跳转到该页面。代码流程如下:

$back = login($name,$pwd);//执行登陆操作,成功就写入session
//如果登录成功,进行以下操作流程
if($back){
  $sessionid = session_id();
  $key = encode($session,$keyword);//生成安全码
  //输出一个登陆成功提示页,并跳转到请求登陆的站点
}

在登陆成功html提示页面中添加如下代码,利用iframe标签请求需要同步登陆的站点

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

//解密$key
decode($key);
//把当前站点的sessionid设置为传递的sessionid
session_id($_GET['sessionid']);
session_start();

2、解决三个站点服务器端共享session的问题。

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

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

$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相关内容感兴趣的读者可查看本站专题:《PHP中cookie用法总结》、《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《PHP网络编程技巧总结》及《php字符串(string)用法总结

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

相关文章

  • php代码中使用换行及(\n或\r\n和br)的应用

    php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;如果需要将结果输出到浏览器或打印到显示器,代码中使用br;如果只是在源代码中换行,则使用\n或\r\n,感兴趣的朋友可以了解下,或许对你学习php有所帮助
    2013-02-02
  • PHP判断IP并转跳到相应城市分站的方法

    PHP判断IP并转跳到相应城市分站的方法

    这篇文章主要介绍了PHP判断IP并转跳到相应城市分站的方法,实例分析了php解析URL及跳转的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 用PHP读取和编写XML DOM的实现代码

    用PHP读取和编写XML DOM的实现代码

    有许多技术可用于用 PHP 读取和编写 XML。本文提供了三种方法读取 XML:使用 DOM 库、使用 SAX 解析器和使用正则表达式。还介绍了使用 DOM 和 PHP 文本模板编写 XML。
    2011-02-02
  • PHP Session变量不能传送到下一页的解决方法

    PHP Session变量不能传送到下一页的解决方法

    在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递。这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题。
    2009-11-11
  • PHP生成条形码大揭秘

    PHP生成条形码大揭秘

    前阵子在接触到一个商家优惠券的功能,需要用到条形码,于是将资料重新整理下,需要的朋友可以参考下
    2015-09-09
  • php生成图片验证码

    php生成图片验证码

    验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成常见的验证码
    2015-06-06
  • php比较多维数组中值的大小排序实现代码

    php比较多维数组中值的大小排序实现代码

    php中根据数组的键(key)进行比较,排序,有很多内置函数可以轻松解决,如krsort(), ksort()等。如果是根据数组的值(value)进行比较就麻烦一些
    2012-09-09
  • php+ajax实现无刷新的新闻留言系统

    php+ajax实现无刷新的新闻留言系统

    这篇文章主要介绍了一款基于php+ajax无刷新的新闻留言系统实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • php数组合并array_merge()函数使用注意事项

    php数组合并array_merge()函数使用注意事项

    array_merge()函数在php中是对数组进行合并的,可以把多个数组合成一个数组,并且不改变原数组(www.111cn.net)的值了,但今天我在使用array_merge合并数组时碰到几个小细节上的问题,下面我举例子给各位朋友看看
    2014-06-06
  • php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数

    php数组函数序列 之array_count_values() 统计数组中所有值出现的

    array_count_values() 函数用于统计数组中所有值出现的次数,本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。
    2011-10-10

最新评论