1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > php如何通过多站点共享seeion实现单点登录(code)

php如何通过多站点共享seeion实现单点登录(code)

时间:2022-12-13 07:36:31

相关推荐

php如何通过多站点共享seeion实现单点登录(code)

后端开发|php教程

php,单点登录

后端开发-php教程

php商城微信支持 源码,vscode与vss,ubuntu xorg重启,tomcat错误1053,pandas写sqlite,百度租服务器,小程序 js插件,前端框架的M C,爬虫守宫价位,哪个php开发好,seo搜索引擎优化5,扒网站全套源码软件,实现点击弹出网页,dz怎么导入模板,html5 新闻列表页面,学生档案信息管理系统源码代码,简易通讯录程序lzw

本篇文章给大家带来的内容是关于php如何通过共享seeion实现单点登录(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

淘宝买的游戏源码,vscode在哪里输入参数,ubuntu中阶乘,tomcat自动加内存,爬虫退出命令,php上传读取内容,SEO有哪些职业和要求,帝国虚拟交易网站源码,下载站免费模板lzw

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

讯代理源码,ubuntu 无线无信号,爬虫返回json解析,点菜php,文山seo电话lzw

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

单点登录分为两种情况:

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

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

1、首先解决站点在客户端sessionid(存在cookie中)的共享问题。使用ini_set函数即可指定cookie的域,如下:

ini_set(session.cookie_domain, .);//设置服务器cookie的域,xxxx为公用二级域名

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

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

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

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

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

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

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

和站点的set_cookie.php文件如下

//解密$keydecode($key);//把当前站点的sessionid设置为传递的sessionidsession_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已经被存进了数据库中。

thinkphp 二级域名站点 session共享(单点登录)

php实现web系统单点登录

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。