本文实例讲述了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 java 单点登录_php实现多站点共用session实现单点登录的方法详解相关推荐

  1. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  2. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  3. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  4. java equals重写原则_java中为何重写equals时必须重写hashCode方法详解

    前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...

  5. java工程引用其他工程,Android工程:引用另一个Android工程的方法详解

    现在已经有了一个Android工程A.我们想扩展A的功能,但是不想在A的基础上做开发,于是新建了另外一个Android工程B,想在B中引用A. 一个思路是把工程A做成纯Jar包,这样其他的工程就可以直 ...

  6. java去掉字符串中前后空格函数_JAVA中去掉字符串空格各种方法详解

    1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 代码如下 复制代码 ...

  7. java 取对象的类_Java中通过Class类获取Class对象的方法详解

    前言 本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 阅读API的Class类得知,Class 没有公共 ...

  8. java中乱码产生的原因_java出现乱码的原因与解决方法详解

    java在字符串中统一用Unicode表示.(推荐:java视频教程) 对于任意一个字符串:String string = "测试字符串"; 如果源文件是GBK编码,操作系统默认环 ...

  9. Java基础(二):迭代器(Iterator)(含使用方法详解)

    Java Iterator(迭代器) Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合. Iterator 是 ...

最新文章

  1. Transform组件C#游戏开发快速入门
  2. NYOJ 467 中缀式变后缀式
  3. Neo4j:找到两个纬度/经度之间的中点
  4. [html] 如何实现默认显示git的第一帧图片,当鼠标经过时,播放完整的gif动画
  5. cr3格式是什么意思_尼康DX镜头是什么意思
  6. 一个小小的抽奖活动测试脚本(python2.7)
  7. Learning to Segment Object Candidates
  8. 【转载】合理规划您的硬盘分区
  9. 位操作实现加减乘除四则运算
  10. XGBoost结合SHAP应用:回归、二分类、多分类模型
  11. leetcode:买卖股票最佳时机含手续费
  12. python 获取前几天的日期
  13. 工资倒挂 你怎么看?工作三年薪资不如毕业生!
  14. python中的连乘_python连乘
  15. 百分点科技位居中国数据治理解决方案市场第二
  16. 西北农林科技大学计算机学院保研,坐落在小镇上的985大学,学生家长纷纷嫌弃,考上的人却在偷笑...
  17. SpringBoot----[9]---Spring Boot JdbcTemplate
  18. html5导航栏悬浮置顶,(微信小程序)导航栏悬浮吸顶以及置顶的设置
  19. ht1621b和单片机电平匹配_STM32液晶显示HT1621驱动原理及程序代码
  20. uView1.0 indexList索引列表遇到的坑

热门文章

  1. python求数字平均值_python 求10个数的平均数实例
  2. FloatingActionButton完美显示
  3. java 反射内部匿名内部类_android-反射的使用(反射静态内部类、非静态内部类、匿名内部类等)...
  4. python enumerate用法总结_python enumerate用法总结
  5. javascript:history.go()和history.back()的区别
  6. 实现一个简单的Tomcat
  7. 【初窥javascript奥秘之闭包】叶大侠病都好了,求不踩了:)
  8. 安装Windows Nano Server虚拟机
  9. 安装漂亮的Faenza1.3与Faience0.5图标主题
  10. 20145240 《Java程序设计》第四次实验报告