PHP會話處理——Cookie和Session

PHP會話處理——Cookie和Session

遇到的問題:

我們希望實現單點登錄SSO,即用戶只需一次登錄,網站的所有網頁都將記住用戶的登錄信息。但HTTP是一種無狀態協議,也就是說每次請求都是獨立的,與上一次或下一次請求無關。這就要求程序實現多個頁面之間的信息傳遞。

解決方法:

1. GET和POST

即在每個頁面跳轉的時候傳遞用戶信息。我們可以想象這個方法多麼的耿直,會花費大量的時間在編寫跳轉時的信息傳遞上,而且在跳轉頻繁時難以保證沒有遺漏。

2. 將信息存儲在文件中

將用戶信息存儲在某個文件中

file_put_contents("reg.txt", $username);

每個頁面都可以訪問這個獨立的文件,並提取出其中的信息來識別目前用戶的身份

file_get_contents("reg.txt");

但問題在於頁面可能有多個用戶訪問,多個用戶對一個文件進行修改和查看,無疑會出現混亂。

cookie是由服務器生成,存放在客戶端的用戶信息。當用戶請求網頁時,就會將這些信息一併帶過去,網頁會根據HTTP請求中head所包含的cookie信息來識別用戶身份。

cookie的生成:

$time=time()+60*60*24*7;   //cookie的失效時間
setCookie("username", $_POST["name"], $time);  //設置cookie中變量username的值
setCookie("uid", $row["id"], $time);
setCookie("isLogin", 1, $time);                //設置cookie,1表示用戶已經登錄

cookie的使用

我們可以通過php的超級全局變量來訪問cookie值

print_r($_COOKIE); //將打印出cookie的內容

我們可以在每個頁面的開始加入這段代碼

//判斷用戶是否登錄,若沒有則強制返回登陸界面
if(!$_COOKIE["isLogin"]){
    header("Location:login.php");
    }

cookie的銷燬

setCookie函數不僅能生成也能銷燬cookie,思路就是使cookie到期,或將信息設爲空。

setCookie("uid", '', time()-3600); //通過把失效日期設置爲過去的日期/時間,刪除一個cookie

總結: cookie好比是商場頒發給用戶的會員卡,用戶只要出示此卡就可以在商場任一店面享受服務。缺點就是cookie數據存放在客戶端,不安全(會員卡容易丟),於是有了接下來的Session。

4. Session

既然“會員卡容易丟”,那麼我們可以委託商場代爲保管,而用戶記住自己的“會員卡號”,依然可以在商場裏暢行無阻。這個方法就是session。
Session的數據保存在服務器端,僅將SessionID頒發給用戶,用戶在請求中附帶SessionID,網頁依然可以識別用戶。
根據SessionID存放的位置,分爲基於Cookie的和基於URL的,以下介紹基於Cookie的,即SessionID存放在cookie中的Session。

Session的生成

session_start();    //使用Session,必先啓動Session
echo session_id()."<br>";  //顯示SessionID
echo $_COOKIE[session_name()];  //顯示cookie中的session名

//設置session數據內容
$_SESSION["username"]=$_POST["name"];
$_SESSION["uid"]=$row["id"];
$_SESSION["isLogin5"]=1;

Session的使用

可以使用php超級全局變量訪問Session內容

echo "用戶<b>".$_SESSION["username"]."</b>您好, 這是網站首頁!";

可以在每個頁面的開始加入這段代碼

session_start(); //若sessionID存在則將連接到已有session,若無則新分配一個
//判斷用戶是否登錄,若沒有則強制返回登陸界面
if(!$_SESSION["isLogin"]){
    header("Location:login.php"); 
    }

Session的銷燬

//開啓SESSION
    session_start();

    //清空SESSION值
    $_SESSION=array();

    //刪除客戶端的在COOKIE中的Sessionid
    if(isset($_COOKIE[session_name()])){
        setCookie(session_name(), '', time()-3600, '/');
    }
    //徹底銷燬session
    session_destroy();
發佈了29 篇原創文章 · 獲贊 6 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章