cookie共享:共享同一个session cookie,服务端接受到相同的session idphp
session共享:共享同一个session系统,这样来自不一样二级域的统一session id访问同一会话数据html
web2.0时代,富web应用层出不穷,新公司如雨后春笋般层出不穷,有的专攻一点,有的涵盖普遍,各有各的方向,各有各的理念,嗯,专攻一点的能够狗带了,咱们这里主要讲一下涵盖普遍型的web服务最基本的业务整合模式:单点登陆web
例如开源中国旗下的三个业务单元,主站,我的空间,众包redis
www.oschina.net my.oschina.net zb.oschina.net跨域
在任何一个站点登陆后其余站点都是登陆状态服务器
接下来咱们使用php + redis来实现sso的二级跨域模式,如何安装redis服务器和php的redis.so扩展这里就不说了,请自行百度cookie
例如咱们有session
www.sso.comdom
my.sso.comtcp
设定session的句柄为redis服务器,session的cookie的共同的域为一级父域 :‘.sso.com’
<?php error_reporting(E_ALL); //session的句柄设为redis ini_set('session.save_handler', 'redis'); //session的保存路径设为redis服务器的tcp连接 ini_set('session.save_path', 'tcp://your.redisserver.domian:6379'); //使用session_set_cookie_params来设置session_start()时 //在客户端当前域下保存的session的cookie标识的生存时间,路径,域 session_set_cookie_params(3600, '/', '.mysso.com'); //开启session时,session会在客户端需找当前同源域下的键名为session_name()的cookie //此cookie存储着session_id()的值,服务器根据此标示来识别那条session记录时当前客户端的 //若不存在会按session_set_cookie_params给定的参数设定一条cookie在本地 session_start();
逻辑模块,例如:
if (isset($_SESSION['user'])) { echo "welcome!" . $_SESSION['user'] . '<br/>'; //这里讲明下redis是如何存放session的 $redis = new Redis(); $redis->connect('your.redisserver.domian', 6379); //PHPREDIS_SESSION:session_id() 的组合键为键名,以string类型存放在redis服务器中 $session = $redis->get('PHPREDIS_SESSION:' . session_id()); var_dump($session); } else { if (isset($_POST['submit'])) { $_SESSION['user] = $_POST['user]; $_SESSION['password'] = $_POST['password']; header("location:/"); } else { ?> <!DOCTYPE html> <html> <head> <title>sso_redis</title> </head> <body> <div> <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> <input type="text" name="user" /> <input type="password" name="password" /> <input type="submit" name="submit" value="submit"> </form> </div> </body> </html> <?php }//end post if }//end user if ?>
以上两个模块分别实现了
session经过redis实现共享,session的cookie域的设置
判断用户是否登陆,redis如何保存session
的功能
将以上代码放置到www.sso.com my.sso.com 上(用虚拟主机玩就能够)
在任意站点登陆后均可以实现另外一站点的登陆
父域相同
redis端以String类型存储某session_id的内容