PHP會話處理——Cookie和Session
遇到的問題:
我們希望實現單點登錄SSO,即用戶只需一次登錄,網站的所有網頁都將記住用戶的登錄信息。但HTTP是一種無狀態協議,也就是說每次請求都是獨立的,與上一次或下一次請求無關。這就要求程序實現多個頁面之間的信息傳遞。
解決方法:
1. GET和POST
即在每個頁面跳轉的時候傳遞用戶信息。我們可以想象這個方法多麼的耿直,會花費大量的時間在編寫跳轉時的信息傳遞上,而且在跳轉頻繁時難以保證沒有遺漏。
2. 將信息存儲在文件中
將用戶信息存儲在某個文件中
file_put_contents("reg.txt", $username);
每個頁面都可以訪問這個獨立的文件,並提取出其中的信息來識別目前用戶的身份
file_get_contents("reg.txt");
但問題在於頁面可能有多個用戶訪問,多個用戶對一個文件進行修改和查看,無疑會出現混亂。
3. cookie
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();