這篇文章將為大家詳細(xì)講解有關(guān)怎么在php中利用多站點(diǎn)共用session實(shí)現(xiàn)單點(diǎn)登錄,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)提供高防主機(jī)、云服務(wù)器、香港服務(wù)器、IDC機(jī)房托管等一、站點(diǎn)部署在同一個(gè)服務(wù)器,且使用同一個(gè)二級(jí)域名
這種情況下,比較好解決。
1、首先解決站點(diǎn)在客戶(hù)端sessionid(存在cookie中)的共享問(wèn)題。使用ini_set()函數(shù)即可指定cookie的域,如下:ini_set('session.cookie_domain', '.xxxx.com');
//設(shè)置服務(wù)器cookie的域,xxxx為公用二級(jí)域名
2、其次解決站點(diǎn)在服務(wù)端的session信息的共享。因?yàn)檎军c(diǎn)在同一個(gè)服務(wù)器,所以生成的session文件是可以公用的,可以直接使用sessionid獲取對(duì)應(yīng)的session信息。
二、站點(diǎn)部署在不同的服務(wù)器,使用不同域名
這種情況比較復(fù)雜,因?yàn)檎军c(diǎn)在不同服務(wù)器使用不同域名,在客戶(hù)端不能使用ini_set設(shè)置cookie的作用域,在服務(wù)器端也是各自生成自己的session文件,不能共用,但還是用解決的辦法。
1、首先解決客戶(hù)端sessionid同步問(wèn)題。
假設(shè)我們有三個(gè)站點(diǎn),域名分別是aa.com,bb.com,cc.com。我們?cè)赼a.com上建立一個(gè)共用的登陸入口login.php,三個(gè)網(wǎng)站的登陸請(qǐng)求全部跳轉(zhuǎn)到該頁(yè)面。代碼流程如下:
$back = login($name,$pwd);//執(zhí)行登陸操作,成功就寫(xiě)入session //如果登錄成功,進(jìn)行以下操作流程 if($back){ $sessionid = session_id(); $key = encode($session,$keyword);//生成安全碼 //輸出一個(gè)登陸成功提示頁(yè),并跳轉(zhuǎn)到請(qǐng)求登陸的站點(diǎn) }
在登陸成功html提示頁(yè)面中添加如下代碼,利用iframe標(biāo)簽請(qǐng)求需要同步登陸的站點(diǎn)
aa.com和cc.com站點(diǎn)的set_cookie.php文件如下
//解密$key decode($key); //把當(dāng)前站點(diǎn)的sessionid設(shè)置為傳遞的sessionid session_id($_GET['sessionid']); session_start();
2、解決三個(gè)站點(diǎn)服務(wù)器端共享session的問(wèn)題。
前面已經(jīng)說(shuō)過(guò),因?yàn)槿齻€(gè)站點(diǎn)不在同一個(gè)服務(wù)器,因此會(huì)生成各自的session文件,如果想要共享這些文件,又面臨跨域等一系列問(wèn)題。所以我們轉(zhuǎn)化思路,不使用文件保存session信息,而是把session信息保存到數(shù)據(jù)庫(kù)中。這樣,只要獲得session信息的sessionid,任何站點(diǎn)都可以訪問(wèn)相同的session信息。
我們創(chuàng)建一個(gè)mysql_session.php文件,用于存儲(chǔ)session信息到數(shù)據(jù)庫(kù),代碼如下
$gb_DBname="test"; //數(shù)據(jù)庫(kù)名稱(chēng) $gb_DBuser="root"; //數(shù)據(jù)庫(kù)用戶(hù)名稱(chēng) $gb_DBpass=""; //數(shù)據(jù)庫(kù)密碼 $gb_DBHOSTname="127.0.0.1"; //主機(jī)的名稱(chēng)或是IP地址 $SESS_DBH=""; //數(shù)據(jù)庫(kù)對(duì)象 session_module_name("User"); //定義session存儲(chǔ)按用戶(hù)定義的方式 $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; } //寫(xiě)入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");
php是一個(gè)嵌套的縮寫(xiě)名稱(chēng),是英文超級(jí)文本預(yù)處理語(yǔ)言,它的語(yǔ)法混合了C、Java、Perl以及php自創(chuàng)新的語(yǔ)法,主要用來(lái)做網(wǎng)站開(kāi)發(fā),許多小型網(wǎng)站都用php開(kāi)發(fā),因?yàn)閜hp是開(kāi)源的,從而使得php經(jīng)久不衰。
關(guān)于怎么在php中利用多站點(diǎn)共用session實(shí)現(xiàn)單點(diǎn)登錄就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)頁(yè)標(biāo)題:怎么在php中利用多站點(diǎn)共用session實(shí)現(xiàn)單點(diǎn)登錄-創(chuàng)新互聯(lián)
文章地址:http://www.rwnh.cn/article42/dpesec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、定制開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站收錄、搜索引擎優(yōu)化、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容