php實現(xiàn)多站點共用session實現(xiàn)單點登錄的方法詳解
本文實例講述了php實現(xiàn)多站點共用session實現(xiàn)單點登錄的方法。分享給大家供大家參考,具體如下:
最近閑來無事,總結整理下單點登錄的問題。
單點登錄的基本原理為:客戶端共享sesionid,服務器端共享session信息。通過共同的sessionid在服務器端獲得相同session信息,即可達到單點登錄(即多站點共享用戶信息,一處登錄,處處可用)的目的。
單點登錄分為兩種情況:
一、站點部署在同一個服務器,且使用同一個二級域名
這種情況下,比較好解決。
1、首先解決站點在客戶端sessionid(存在cookie中)的共享問題。使用ini_set()函數(shù)即可指定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,三個網(wǎng)站的登陸請求全部跳轉到該頁面。代碼流程如下:
$back = login($name,$pwd);//執(zhí)行登陸操作,成功就寫入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的問題。
前面已經(jīng)說過,因為三個站點不在同一個服務器,因此會生成各自的session文件,如果想要共享這些文件,又面臨跨域等一系列問題。所以我們轉化思路,不使用文件保存session信息,而是把session信息保存到數(shù)據(jù)庫中。這樣,只要獲得session信息的sessionid,任何站點都可以訪問相同的session信息。
我們創(chuàng)建一個mysql_session.php文件,用于存儲session信息到數(shù)據(jù)庫,代碼如下
$gb_DBname="test"; //數(shù)據(jù)庫名稱 $gb_DBuser="root"; //數(shù)據(jù)庫用戶名稱 $gb_DBpass=""; //數(shù)據(jù)庫密碼 $gb_DBHOSTname="127.0.0.1"; //主機的名稱或是IP地址 $SESS_DBH=""; //數(shù)據(jù)庫對象 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信息的數(shù)據(jù)表名為: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一樣就可以了。你會發(fā)現(xiàn)你賦值的session已經(jīng)被存進了數(shù)據(jù)庫中。
更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP中cookie用法總結》、《php緩存技術總結》、《PHP數(shù)組(Array)操作技巧大全》、《PHP網(wǎng)絡編程技巧總結》及《php字符串(string)用法總結》
希望本文所述對大家PHP程序設計有所幫助。
- php7 list()、session及其他模塊的修改實例分析
- PHP7創(chuàng)建銷毀session的實例方法
- PHP 圖像處理與SESSION制作超簡單驗證碼的方法示例
- PHP 實現(xiàn)超簡單的SESSION與COOKIE登錄驗證功能示例
- PHP cookie與session會話基本用法實例分析
- 如何解決PHP獲取不到SESSION信息之一般情況
- thinkphp 5框架實現(xiàn)登陸,登出及session登陸狀態(tài)檢測功能示例
- PHP實現(xiàn)cookie跨域session共享的方法分析
- PHP使用Session實現(xiàn)上傳進度功能詳解
- PHP SESSION跨頁面?zhèn)鬟f失敗解決方案
相關文章
php正則表達式驗證(郵件地址、Url地址、電話號碼、郵政編碼)
這篇文章主要介紹了php正則表達式驗證,實現(xiàn)郵件地址、Url地址、電話號碼、郵政編碼驗證,感興趣的小伙伴們可以參考一下2016-03-03PHPStudy下載PHP提示“當前網(wǎng)絡不穩(wěn)定,下載失敗”的解決辦法
這篇文章主要介紹了PHPStudy下載PHP提示“當前網(wǎng)絡不穩(wěn)定,下載失敗”的解決辦法,文中通過圖文結合的方式給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-08-08js基于qrcode.js生成二維碼的方法【附demo插件源碼下載】
這篇文章主要介紹了js基于qrcode.js生成二維碼的方法,結合實例形式分析了基于qrcode.js文件生成二維碼的具體實現(xiàn)技巧,需要的朋友可以參考下2016-12-12php expects parameter 1 to be resource, array given 錯誤
從名字可以看出來這是說你傳的參數(shù)有問題,也就是說,你在定義傳遞參數(shù)的時候 例如 mysql_query($query,$result),這兩個參數(shù),你只用了$query這個參數(shù),那么$result這個參數(shù),沒有使用,就會報這個錯誤2011-03-03PHP中strnatcmp()函數(shù)“自然排序算法”進行字符串比較用法分析(對比strcmp函數(shù))
這篇文章主要介紹了PHP中strnatcmp()函數(shù)“自然排序算法”進行字符串比較用法,結合實例形式分析了strnatcmp函數(shù)字符串比較的使用技巧,并對比了strcmp函數(shù)說明了兩者的使用區(qū)別,需要的朋友可以參考下2016-01-01PHP中file_exists()判斷中文文件名無效的解決方法
這篇文章主要介紹了PHP中file_exists()判斷中文文件名無效的解決方法,是很多PHP開發(fā)人員都會遇到的問題,主要涉及對編碼的轉換,需要的朋友可以參考下2014-11-11