佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > php實現(xiàn)多站點共用session實現(xiàn)單點登錄的方法詳解

php實現(xiàn)多站點共用session實現(xiàn)單點登錄的方法詳解

熱門標簽:Mysql連接數(shù)設(shè)置 阿里云 服務(wù)器配置 團購網(wǎng)站 銀行業(yè)務(wù) 科大訊飛語音識別系統(tǒng) 電子圍欄 Linux服務(wù)器

本文實例講述了php實現(xiàn)多站點共用session實現(xiàn)單點登錄的方法。分享給大家供大家參考,具體如下:

最近閑來無事,總結(jié)整理下單點登錄的問題。

單點登錄的基本原理為:客戶端共享sesionid,服務(wù)器端共享session信息。通過共同的sessionid在服務(wù)器端獲得相同session信息,即可達到單點登錄(即多站點共享用戶信息,一處登錄,處處可用)的目的。

單點登錄分為兩種情況:

一、站點部署在同一個服務(wù)器,且使用同一個二級域名

這種情況下,比較好解決。

1、首先解決站點在客戶端sessionid(存在cookie中)的共享問題。使用ini_set()函數(shù)即可指定cookie的域,如下: ini_set('session.cookie_domain', '.xxxx.com');//設(shè)置服務(wù)器cookie的域,xxxx為公用二級域名

2、其次解決站點在服務(wù)端的session信息的共享。因為站點在同一個服務(wù)器,所以生成的session文件是可以公用的,可以直接使用sessionid獲取對應(yīng)的session信息。

二、站點部署在不同的服務(wù)器,使用不同域名

這種情況比較復(fù)雜,因為站點在不同服務(wù)器使用不同域名,在客戶端不能使用ini_set設(shè)置cookie的作用域,在服務(wù)器端也是各自生成自己的session文件,不能共用,但還是用解決的辦法。

1、首先解決客戶端sessionid同步問題。

假設(shè)我們有三個站點,域名分別是aa.com,bb.com,cc.com。我們在aa.com上建立一個共用的登陸入口login.php,三個網(wǎng)站的登陸請求全部跳轉(zhuǎn)到該頁面。代碼流程如下:

$back = login($name,$pwd);//執(zhí)行登陸操作,成功就寫入session
//如果登錄成功,進行以下操作流程
if($back){
  $sessionid = session_id();
  $key = encode($session,$keyword);//生成安全碼
  //輸出一個登陸成功提示頁,并跳轉(zhuǎn)到請求登陸的站點
}

在登陸成功html提示頁面中添加如下代碼,利用iframe標簽請求需要同步登陸的站點

aa.com和cc.com站點的set_cookie.php文件如下

//解密$key
decode($key);
//把當前站點的sessionid設(shè)置為傳遞的sessionid
session_id($_GET['sessionid']);
session_start();

2、解決三個站點服務(wù)器端共享session的問題。

前面已經(jīng)說過,因為三個站點不在同一個服務(wù)器,因此會生成各自的session文件,如果想要共享這些文件,又面臨跨域等一系列問題。所以我們轉(zhuǎn)化思路,不使用文件保存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ù)庫中。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP中cookie用法總結(jié)》、《php緩存技術(shù)總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》及《php字符串(string)用法總結(jié)》

希望本文所述對大家PHP程序設(shè)計有所幫助。

您可能感興趣的文章:
  • 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失敗解決方案

標簽:大理 衢州 蚌埠 江蘇 廣元 衡水 棗莊 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標題《php實現(xiàn)多站點共用session實現(xiàn)單點登錄的方法詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    叶城县| 榆中县| 美姑县| 阳原县| 会同县| 定陶县| 洪洞县| 博客| 濮阳市| 凤城市| 大新县| 进贤县| 乐都县| 巢湖市| 保靖县| 宁化县| 田阳县| 元阳县| 临城县| 怀宁县| 临颍县| 大英县| 萨迦县| 无极县| 永济市| 库伦旗| 利辛县| 利津县| 家居| 水城县| 柳江县| 奉贤区| 东城区| 宜兰县| 梁平县| 旅游| 吉首市| 屯门区| 庆阳市| 托克逊县| 永泰县|