本文通过一个实例介绍了用php实现多站点会话和单点登录的方法。分享给大家参考,如下:
最近没事干。总结梳理单点登录存在的问题。
单点登录的基本原理是客户端共享会话id,服务器共享会话信息。单点登录(即多站点共享用户信息,一次登录,随处可用)的目的可以通过公共sessionid在服务器端获取相同的会话信息来实现。
单点登录分为两种情况:
首先,站点部署在同一台服务器上,并使用相同的辅助域名
在这种情况下,更容易解决。
1.首先,解决在客户端共享站点sessionid(存在于cookie中)的问题。使用ini_set()函数指定cookie域,如下所示:ini _ set ('session。cookie _ domain ', xxxx.com ');//设置服务器cookie的域,xxxx为公共二级域名
2.其次,解决服务器上会话信息的共享。因为站点在同一个服务器上,所以生成的会话文件可以共享,并且可以通过使用sessionid直接获得相应的会话信息。
第二,网站部署在不同的服务器上,使用不同的域名
这种情况比较复杂,因为站点在不同的服务器上使用不同的域名,客户端无法使用ini_set设置cookie的范围。在服务器端,它还生成自己的会话文件,该文件不能共享,但解决方案仍在使用。
1.首先,解决客户端sessionid同步问题。
假设我们有三个网站,域名是aa.com,bb.com和cc.com。我们在aa.com建立了一个通用的登录门户login.php,三个网站的所有登录请求都跳转到这个页面。代码流程如下:
$back=login($name,$ pwd);//执行登录操作,如果成功则写会话。//如果登录成功,如果($ back) {$ sessionid=session _ id(),则执行以下操作流程;$key=encode($session,$ keyword);//生成安全代码//输出登录成功提示页面,跳转到请求登录的站点}在登录成功html提示页面添加以下代码,使用iframe标签请求需要同步登录的站点
aa.com和cc.com站点的Set_cookie.php文件如下
//decrypt $ key decode($ key);//将当前站点的sessionid设置为传递的session id session _ id($ _ get[' session id ']);session _ start();2.解决三个站点的服务器之间共享会话的问题。
如前所述,因为这三个站点不在同一个服务器上,所以它们将生成自己的会话文件。如果要共享这些文件,就会面临跨域等一系列问题。因此,我们改变了思路,将会话信息保存在数据库中,而不是使用文件。这样,只要获得会话信息的sessionid,任何站点都可以访问相同的会话信息。
我们创建一个mysql_session.php文件来存储数据库中的会话信息。代码如下
$ gb _ DBname=' test//数据库名称$ gb _ DBuser=' root//数据库用户名称$ gb _ DBpass=//数据库密码$ GB _ DBhostname=' 127。0 .0 .1 ';//主机的名称或是互联网协议(互联网协议)地址$ SESS _ DBH=' ';//数据库对象会话_模块_名称('用户');//定义会议存储按用户定义的方式$ SESS _ LIFE=get _ CFG _ var(' session。GC _ max生存期’);//得到会议的最大有效期,也可以自定义函数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错误: ' .mysql_error().'';die();} if(!mysql_select_db($gb_DBname,$ SESS _ DBH)){ echo ' MySql错误: ' .mysql_error().'';die();}返回真}函数sess _ close(){ 0返回真}函数SESS _ read($ key){ global $ SESS _ DBH,$ SESS _ LIFE$qry='从db_session中选择值,其中sesskey='$key '和到期日.time();$qid=mysql_query($qry,$ SESS _ DBH);if(list($ value)=MySQL _ fetch _ row($ qid)){ return $ value;}返回false}//写入会议信息。保存会议信息的数据表名为:db_session//除了主键自增id,需要的字段如下//sesskey sessionid//values会话值//到期会话的到期日期函数sess_write($key,$val){ global $SESS_DBH,$ SESS _ LIFE $ expire=time()$ SESS _ LIFE;$ value=$ val$ qry='插入到db _ session中值(' $key ',$ expiry ',$ value ')';$qid=mysql_query($qry,$ SESS _ DBH);if(!$ qid){ $ qry=' update db _ session set expire=$ expire,value='$value ',其中sesskey='$key '和过期.time();$qid=mysql_query($qry,$ SESS _ DBH);}返回$ qid}函数SESS _ destroy($ key){ global $ SESS _ DBH;$qry='从db_session中删除,其中SESS key=' $ key $ qid=MySQL _ query($ qry,$ SESS _ DBH);返回$ qid}函数SESS _ GC($最大寿命){ global $ SESS _ DBH;$qry="从到期的db_session中删除"。time();$qid=mysql_query($qry,$ SESS _ DBH);返回MySQL _受影响_行($ SESS _ DBH);} session _ set _ save _ handler(' sess _ open ',' sess_close ',' sess_read ',' sess_write ',' sess_destroy ',' sess _ GC ');之后在需要使用会议的页面中,在session_start()之前引入该文件,其他的跟平时使用支持多一样就可以了。你会发现你赋值的会议已经被存进了数据库中。
更多关于服务器端编程语言(专业超文本预处理器的缩写)相关内容感兴趣的读者可查看本站专题: 《PHP中cookie用法总结》 、 《php缓存技术总结》 、 《PHP数组(Array)操作技巧大全》 、 《PHP网络编程技巧总结》 及《php字符串(string)用法总结》
希望本文所述对大家服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。