php实现多站点共用session实现单点登录的方法详解
php  /  管理员 发布于 7年前   246
本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下: 最近闲来无事,总结整理下单点登录的问题。 单点登录的基本原理为:客户端共享sesionid,服务器端共享session信息。通过共同的sessionid在服务器端获得相同session信息,即可达到单点登录(即多站点共享用户信息,一处登录,处处可用)的目的。 单点登录分为两种情况: 一、站点部署在同一个服务器,且使用同一个二级域名 这种情况下,比较好解决。 1、首先解决站点在客户端sessionid(存在cookie中)的共享问题。使用ini_set()函数即可指定cookie的域,如下: 2、其次解决站点在服务端的session信息的共享。因为站点在同一个服务器,所以生成的session文件是可以公用的,可以直接使用sessionid获取对应的session信息。 二、站点部署在不同的服务器,使用不同域名 这种情况比较复杂,因为站点在不同服务器使用不同域名,在客户端不能使用ini_set设置cookie的作用域,在服务器端也是各自生成自己的session文件,不能共用,但还是用解决的办法。 1、首先解决客户端sessionid同步问题。 假设我们有三个站点,域名分别是aa.com,bb.com,cc.com。我们在aa.com上建立一个共用的登陆入口login.php,三个网站的登陆请求全部跳转到该页面。代码流程如下: 在登陆成功html提示页面中添加如下代码,利用iframe标签请求需要同步登陆的站点 aa.com和cc.com站点的set_cookie.php文件如下 2、解决三个站点服务器端共享session的问题。 前面已经说过,因为三个站点不在同一个服务器,因此会生成各自的session文件,如果想要共享这些文件,又面临跨域等一系列问题。所以我们转化思路,不使用文件保存session信息,而是把session信息保存到数据库中。这样,只要获得session信息的sessionid,任何站点都可以访问相同的session信息。 我们创建一个mysql_session.php文件,用于存储session信息到数据库,代码如下 之后在需要使用session的页面中,在session_start()之前引入该文件,其他的跟平时使用seesion一样就可以了。你会发现你赋值的session已经被存进了数据库中。 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP中cookie用法总结》、《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《PHP网络编程技巧总结》及《php字符串(string)用法总结》 希望本文所述对大家PHP程序设计有所帮助。ini_set('session.cookie_domain', '.xxxx.com');//设置服务器cookie的域,xxxx为公用二级域名$back = login($name,$pwd);//执行登陆操作,成功就写入session//如果登录成功,进行以下操作流程if($back){ $sessionid = session_id(); $key = encode($session,$keyword);//生成安全码 //输出一个登陆成功提示页,并跳转到请求登陆的站点}//解密$keydecode($key);//把当前站点的sessionid设置为传递的sessionidsession_id($_GET['sessionid']);session_start();
$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");您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号
