用戶創建與使用cookie全過程
1.用戶訪問網站
當用戶使用瀏覽器訪問一個網站時,瀏覽器會向服務器發送一個HTTP請求。
2. 服務器響應請求
服務器接收到HTTP請求后,會處理請求并準備響應。如果服務器需要設置Cookie,它會在HTTP響應頭中包含一個Set-Cookie
指令。
3. 創建Cookie
服務器使用setcookie()
函數(在PHP中)或等效的方法來創建Cookie。這個函數允許服務器設置Cookie的名稱、值、過期時間、路徑、域和其他屬性。
PHP示例:
setcookie("user_id", "12345", time() + 3600, "/", "example.com", false, true);
"user_id"
?是Cookie的名稱。"12345"
?是Cookie的值。time() + 3600
?設置Cookie的過期時間為當前時間加1小時。"/"
?指定Cookie的Path
屬性,意味著Cookie對于example.com
的所有頁面都是可訪問的。"example.com"
?指定Cookie的Domain
屬性,意味著Cookie僅在example.com
域下有效。false
?表示不使用安全的傳輸層協議(HTTPS)。true
?設置Cookie為HttpOnly
,這意味著Cookie不能通過JavaScript訪問,增加了安全性。
4. 發送Cookie到瀏覽器
服務器將帶有Set-Cookie
指令的HTTP響應發送回瀏覽器。瀏覽器解析這些指令,并根據它們創建Cookie。
5. 瀏覽器存儲Cookie
瀏覽器會將接收到的Cookie存儲在內存中(會話Cookie)或磁盤上(持久Cookie)。存儲的位置和方式由瀏覽器的隱私和安全設置決定。
6. 后續請求自動攜帶Cookie
當用戶在同一個域和路徑下進行后續請求時,瀏覽器會自動在HTTP請求頭中包含之前存儲的Cookie,通過Cookie
指令發送回服務器。
示例:
Cookie: user_id=12345; other_cookie=value
7. 服務器接收Cookie
服務器接收到帶有Cookie的HTTP請求后,可以從請求頭中讀取Cookie的值,并使用這些信息來識別用戶的狀態或偏好。
8. 使用Cookie信息
服務器可以使用Cookie中的信息來個性化用戶的體驗,例如,通過使用用戶的ID來恢復他們的購物車內容,或者根據用戶的偏好提供定制化的內容。
9. Cookie的生命周期結束
Cookie的生命周期可以是短暫的(會話Cookie),也可以是持久的(設置了過期時間的Cookie)。
- 會話Cookie?在用戶關閉瀏覽器時自動刪除。
- 持久Cookie?會在指定的過期時間到達后自動刪除,或者用戶可以手動清除它們。
10. 刪除Cookie
可以通過兩種方式刪除Cookie:
- 過期:當Cookie的過期時間到達時,瀏覽器會自動刪除它。
- 手動:用戶可以手動通過瀏覽器設置刪除Cookie,或者服務器可以通過發送一個帶有過去過期時間的
Set-Cookie
指令來指示瀏覽器刪除特定的Cookie。
?
cookie:用戶登錄實例
登錄流程:
-
用戶輸入信息:用戶在登錄頁面輸入用戶名和密碼。
-
提交驗證:用戶提交表單,這些信息以POST請求的形式發送到服務器。
-
服務器驗證:服務器接收到請求,驗證數據庫中的用戶名和密碼是否與用戶輸入的匹配。
-
設置cookie:一旦驗證成功,服務器使用
setcookie()
函數創建一個cookie來標識用戶已登錄 -
重定向:服務器通常會重定向用戶到一個受保護的頁面或用戶的個人主頁。
維持登錄狀態:
-
發送cookie:瀏覽器會在每次請求服務器時自動攜帶相關的cookie。
-
檢查cookie:服務器檢查請求中是否包含特定的cookie來確定用戶是否已登錄:
注銷流程:
-
注銷請求:用戶點擊注銷鏈接,請求服務器結束會話。
-
刪除cookie:服務器通過設置cookie的過期時間為過去的時間來刪除它:
-
重定向到登錄頁面:注銷后,通常將用戶重定向回登錄頁面。
前端:進行用戶登錄,并提交post表單到指定腳本
07.php
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="09.php" method="post" >用戶名<input type="text" name="username">郵箱<input type="text" name="email"><input type="submit"></form>
</body>
</html>
后端登錄驗證,驗證用戶名密碼后,創建cookie存儲用戶名
09.php
<?phpif(empty($_POST['uname']) || empty($_POST['passwd'])){if($_POST['uname'] == "zhangsan" && $_POST['passwd'] == 123456){setcookie("username",$_POST['uname'],time()+3600);echo '<a href="06.php" target="_blank" >access</a>';}else{echo '<script>alert("Invalid username or password")</script>';}}else{echo '<script>alert("The user name and password are empty")</script>';}?>
?檢查用戶提交的用戶名和密碼,如果用戶名是"zhangsan"且密碼是123456,則會設置一個名為"username"的cookie,并將用戶重定向到名為"06.php"的頁面。如果用戶名或密碼不正確,或者兩者都為空,會彈出一個警告框提示用戶。
代碼檢查前端表單,使用empty函數檢查
$_POST['uname']屬性,和
$_POST['passwd']屬性是否為空,并使用邏輯與進行運算。最后使用邏輯非取反
如果用戶名和密碼不為空,腳本繼續檢查用戶名是否是"zhangsan"且密碼是否是123456。
如果用戶名和密碼都正確,腳本使用
setcookie
函數設置一個名為"username"的cookie,該cookie的值為用戶提交的用戶名,并且有效期為1小時(3600秒)。然后會輸出一個a標簽,鏈接到"06.php"頁面的超鏈接,用戶可以通過點擊這個鏈接繼續訪問。
如果用戶名或密碼不正確,腳本會輸出一個JavaScript的
alert
函數,彈出提示框,提示用戶“Invalid username or password”。如果前端傳遞表單中,用戶名和密碼其一,或都為空,腳本會輸出一個JavaScript的
alert
函數,彈出提示框,提示用戶“The user name and password are empty”。
測試登錄狀態
檢查cookie中是否有用戶登錄參數,并且根據檢查結果提供不同的響應。
06.php
<?php header("content-type:text/html;charset=utf8");if(!(empty($_COOKIE['username']))){echo '歡迎用戶:' . $_COOKIE['username'];}else{echo "<script >";echo "alert('未登錄,即將重定向');";echo "window.location.href='08.html';";echo "</script>";}// echo '<a href="10.php">點擊清除登錄信息</a>';echo'<form action="10.php" method="get">';echo'<button type="submit">點擊清除登錄信息</button>';echo'</form>';?>
1.使用
empty()
函數檢查$_COOKIE['username']
是否為空。
$_COOKIE
是一個超全局變量,它包含了所有由客戶端發送到服務器的cookie信息。如果
username
cookie不為空,說明用戶已經登錄。?
2.如果用戶已經登錄,輸出歡迎信息,并將用戶名(存儲在
username
cookie中的值)展示給用戶。如果
username
cookie為空,表示用戶尚未登錄。?
3.在用戶未登錄的情況下,代碼將執行以下操作:
- 使用
<script>
標簽內聯定義一個JavaScript腳本。- 使用
alert()
函數彈出一個警告框,提示用戶未登錄。- 使用
window.location.href='08.html';
將用戶重定向到08.html
頁面。?
4.無論用戶是否登錄,接下來的代碼提供了一個表單,其中包含一個按鈕。
當用戶點擊這個按鈕時,表單會以GET方法提交并跳轉到
10.php
,用于清除登錄信息,例如刪除相關的cookie。
?
用戶退出登錄狀態,清除cookie值
10.php
<?phpsetcookie("username",$_COOKIE['username'],time()-3600);header("Location:08.html");
?>
清除cookie,并重定向到前端登錄頁面:?
setcookie("username", $_COOKIE['username'], time() - 3600);
:
setcookie()
函數用于設置cookie。- 第一個參數
"username"
是要設置的cookie的名稱。- 第二個參數
$_COOKIE['username']
是從客戶端發送到服務器的現有cookie的值。這意味著即使用戶之前沒有設置username
?cookie,這段代碼也不會產生錯誤,因為$_COOKIE['username']
在沒有對應cookie時為null。- 第三個參數
time() - 3600
設置了cookie的過期時間。time()
函數返回當前的Unix時間戳,減去3600(一個小時的秒數)意味著cookie會在設置后的一個小時前過期,這實際上會立即刪除這個cookie。
header("Location: 08.html");
:
header()
函數用于發送原始的HTTP頭部到客戶端。在這里,它發送的是一個Location
頭部,這會告訴瀏覽器服務器希望客戶端重定向到另一個URL。"08.html"
是服務器上的目標頁面的路徑,用戶將被重定向到這個頁面。
setcookie擴展
在PHP中,創建一個同名的cookie并立即設置其過期時間,實際上是一個刪除該cookie的技巧。這是因為HTTP協議沒有直接提供刪除cookie的方法,但你可以通過設置一個過期時間來間接刪除它。
創建并刪除同名cookie的步驟和原因:
創建同名cookie:使用
setcookie()
函數創建一個同名的cookie,意味著你正在創建一個新的cookie來覆蓋之前存在的同名cookie。設置過期時間:將新cookie的過期時間設置為當前時間減去一個較大的數值(例如3600秒,即1小時)。這樣,新cookie的過期時間實際上是在過去,這告訴瀏覽器該cookie已經不再有效。
瀏覽器響應:瀏覽器接收到這個帶有過去過期時間的cookie后,會認為它已經過期,并從用戶的系統中刪除它。
?