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的內容