全棧:Web 用戶登錄過程實例與Cookie管理

用戶創建與使用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:用戶登錄實例

登錄流程:

  1. 用戶輸入信息:用戶在登錄頁面輸入用戶名和密碼。

  2. 提交驗證:用戶提交表單,這些信息以POST請求的形式發送到服務器。

  3. 服務器驗證:服務器接收到請求,驗證數據庫中的用戶名和密碼是否與用戶輸入的匹配。

  4. 設置cookie:一旦驗證成功,服務器使用setcookie()函數創建一個cookie來標識用戶已登錄

  5. 重定向:服務器通常會重定向用戶到一個受保護的頁面或用戶的個人主頁。

維持登錄狀態:

  1. 發送cookie:瀏覽器會在每次請求服務器時自動攜帶相關的cookie。

  2. 檢查cookie:服務器檢查請求中是否包含特定的cookie來確定用戶是否已登錄:

注銷流程:

  1. 注銷請求:用戶點擊注銷鏈接,請求服務器結束會話。

  2. 刪除cookie:服務器通過設置cookie的過期時間為過去的時間來刪除它:

  3. 重定向到登錄頁面:注銷后,通常將用戶重定向回登錄頁面。

前端:進行用戶登錄,并提交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"的頁面。如果用戶名或密碼不正確,或者兩者都為空,會彈出一個警告框提示用戶。

  1. 代碼檢查前端表單,使用empty函數檢查$_POST['uname']屬性,和$_POST['passwd']屬性是否為空,并使用邏輯與進行運算。最后使用邏輯非取反

  2. 如果用戶名和密碼不為空,腳本繼續檢查用戶名是否是"zhangsan"且密碼是否是123456。

  3. 如果用戶名和密碼都正確,腳本使用setcookie函數設置一個名為"username"的cookie,該cookie的值為用戶提交的用戶名,并且有效期為1小時(3600秒)。

  4. 然后會輸出一個a標簽,鏈接到"06.php"頁面的超鏈接,用戶可以通過點擊這個鏈接繼續訪問。

  5. 如果用戶名或密碼不正確,腳本會輸出一個JavaScript的alert函數,彈出提示框,提示用戶“Invalid username or password”。

  6. 如果前端傳遞表單中,用戶名和密碼其一,或都為空,腳本會輸出一個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,并重定向到前端登錄頁面:?

  1. 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。
  2. header("Location: 08.html");

    • header()函數用于發送原始的HTTP頭部到客戶端。在這里,它發送的是一個Location頭部,這會告訴瀏覽器服務器希望客戶端重定向到另一個URL。
    • "08.html"是服務器上的目標頁面的路徑,用戶將被重定向到這個頁面。

setcookie擴展

在PHP中,創建一個同名的cookie并立即設置其過期時間,實際上是一個刪除該cookie的技巧。這是因為HTTP協議沒有直接提供刪除cookie的方法,但你可以通過設置一個過期時間來間接刪除它。

創建并刪除同名cookie的步驟和原因:

  1. 創建同名cookie:使用setcookie()函數創建一個同名的cookie,意味著你正在創建一個新的cookie來覆蓋之前存在的同名cookie。

  2. 設置過期時間:將新cookie的過期時間設置為當前時間減去一個較大的數值(例如3600秒,即1小時)。這樣,新cookie的過期時間實際上是在過去,這告訴瀏覽器該cookie已經不再有效。

  3. 瀏覽器響應:瀏覽器接收到這個帶有過去過期時間的cookie后,會認為它已經過期,并從用戶的系統中刪除它。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18116.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot整合RabbitMQ的快速使用教程

目錄 一、引入依賴 二、配置rabbitmq的連接信息等 1、生產者配置 2、消費者配置 三、設置消息轉換器 四、生產者代碼示例 1、配置交換機和隊列信息 2、生產消息代碼 五、消費者代碼示例 1、消費層代碼 2、業務層代碼 在分布式系統中&#xff0c;消息隊列是一種重要…

#職場發展#其他

一閃論文是目前市場上一款非常靠譜的論文寫作工具&#xff0c;不僅可以幫助用戶快速完成論文撰寫&#xff0c;還能對文章進行查重降重&#xff0c;確保內容原創性。從用戶的角度來看&#xff0c;一閃論文確實是一個非常方便、實用的工具&#xff0c;能夠大大提高寫作效率&#…

00Java準備工作

目錄 JDK的安裝目錄 JAVA環境變量的配置 JAVA小知識 JDK的安裝目錄 目錄名稱說明bin該路徑下存放了JDK的各種工具命令,javac和java就放在這個目錄conf該路徑下存放了JDK的相關配置文件include該路徑下存放了一些平臺特定的頭文件jmods該路徑下存放了JDK的各種模塊legal該路…

簡單隨機數據算法

文章目錄 一&#xff0c;需求概述二&#xff0c;實現代碼三、測試代碼四、測試結果五、源碼傳送六、效果演示 一&#xff0c;需求概述 系統啟動時&#xff0c;讀取一組圖片數據&#xff0c;通過接口返回給前臺&#xff0c;要求&#xff1a; 圖片隨機相鄰圖片不重復 二&#…

Java數據結構與算法(散列表)

前言 散列表是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說&#xff0c;它通過把關鍵碼值映射到表中一個位置來訪問記錄&#xff0c;以加快查找的速度。而key的沖突主要通過鏈表的方式來處理&#xff0c;后期鏈表過長情況下可以通過紅黑樹來優化查詢效率。 實…

進程互斥經典問題(讀寫者問題、理發店問題)

目錄 讀寫者問題 問題描述 問題分析 進程互斥問題三部曲 讀者寫者算法實現 一、找進程——確定進程關系 二、找主營業務 三、找同步約束 a.互斥 b.資源 c.配額 理發店問題 問題描述 問題分析 進程互斥問題三部曲 理發店問題算法實現 一、找進程——確定進程…

SB-OSC,最新的 MySQL Schema 在線變更方案

目前主流的 MySQL 在線變更方案有兩個&#xff1a; 基于 trigger 的 pt-online-schema-change基于 binlog 的 gh-ost 上周 Sendbird 剛開源了他們的 MySQL Schema 在線變更方案 SB-OSC: Sendbird Online Schema Change。 GitHub 上剛剛 25 顆星星&#xff0c;絕對新鮮出爐。 …

Qt Creator(2)【如何在Qt Creator中創建新工程】

閱讀導航 引言一、Qt Creator開始界面介紹二、如何在Qt Creator中創建新工程1. 新建項目2. 選擇項目模板3. 選擇項目路徑4. 選擇構建系統5. 填寫類信息設置界面6. 選擇語言和翻譯文件7. 選擇Qt套件8. 選擇版本控制系統9. 最終效果 三、認識Qt Creator項目內容界面1. 基本界面2.…

React Native 之 處理觸摸事件(八)

React Native 提供了可以處理常見觸摸手勢&#xff08;例如點擊或滑動&#xff09;的組件&#xff0c; 以及可用于識別更復雜的手勢的完整的手勢響應系統。 Button是一個簡單的跨平臺的按鈕組件。下面是一個最簡示例&#xff1a; <ButtononPress{() > {Alert.alert(你點…

go語言初識別(五)

本博客內容涉及到&#xff1a;切片 切片 1. 切片的概念 首先先對數組進行一下回顧&#xff1a; 數組定義完&#xff0c;長度是固定的&#xff0c;例如&#xff1a; var num [5]int [5]int{1,2,3,4,5}定義的num數組長度是5&#xff0c;表示只能存儲5個整形數字&#xff0c…

檢索模型預訓練方法:RetroMAE

論文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 論文鏈接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一種新的MAE工作流&#xff0c;編碼器和解器輸入進行了不同的掩…

華為OD機試【計算最接近的數】(java)(100分)

1、題目描述 給定一個數組X和正整數K&#xff0c;請找出使表達式X[i] - X[i1] … - X[i K 1]&#xff0c;結果最接近于數組中位數的下標i&#xff0c;如果有多個i滿足條件&#xff0c;請返回最大的i。 其中&#xff0c;數組中位數&#xff1a;長度為N的數組&#xff0c;按照元…

軟件性能測試有哪些測試類型和方法?

軟件性能測試是一種通過模擬真實用戶使用情況&#xff0c;評估軟件系統在各種壓力和負載下的表現的測試方法。在今天這個講究效率的時代&#xff0c;軟件性能測試是不可或缺的一環。它能幫助開發人員和企業發現潛在的性能問題&#xff0c;提前優化改進&#xff0c;保證軟件系統…

Flutter 中的 SizeChangedLayoutNotifier 小部件:全面指南

Flutter 中的 SizeChangedLayoutNotifier 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;SizeChangedLayoutNotifier 是一種特殊的小部件&#xff0c;它用于監聽其子組件尺寸的變化。當子組件的大小發生變化時&#xff0c;SizeChangedLayoutNotifier 可以通知其他組件…

動態內存管理—C語言通訊錄

目錄 一&#xff0c;動態內存函數的介紹 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的內存開辟 二&#xff0c;通訊錄管理系統 動態內存函數的介紹 malloc free calloc realloc 一&#xff0c;動態內存函數的介紹 1.1 malloc和free void* malloc (…

回文鏈表(快慢指針解法之在推進過程中反轉)

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd;抱怨深處黑暗&#xff0c;不如提燈前行…

進程間通信IPC機制

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。IPC機制有多種方式&#xff0c;每種方式都有其特定的工作原理、應用場景以及優缺點。以下是對幾種主要IPC方式的詳細解釋&#xff1a; 管道&#xff08;Pipe&a…

數據結構算法題day04

數據結構算法題day04 題目分析算法思想代碼完整運行代碼如下&#xff1a; 題目 對長度為n的順序表L&#xff0c;編寫一個時間復雜度為O(n)、空間復雜度為O(1)的算法 該算法刪除線性表中所有值為X的數據元素。分析 O(n) -> 掃描一次順序表 O(1) -> 申請常數個輔助空間 1…

代碼隨想錄算法訓練營day14|二叉樹的遞歸遍歷、二叉樹的迭代遍歷、二叉樹的統一迭代法

二叉樹的遞歸遍歷 首先需要明確的一點是&#xff0c;前序中序和后序在二叉樹的遞歸遍歷中的區別僅在于遞歸函數中操作的順序&#xff0c;前序是在遍歷一個節點的左右子樹前進行操作&#xff0c;中序是在遍歷一個節點的左子樹后進行操作再遍歷右子樹&#xff0c;而后序是在遍歷…

C++算術運算和自增自減運算

一 引言 表示運算的符號稱為運算符。 算術運算&#xff1b; 比較運算&#xff1b; 邏輯運算&#xff1b; 位運算&#xff1b; 1 算術運算 算術運算包括加、減、乘、除、乘方、指數、對數、三角函數、求余函數&#xff0c;這些都是算術運算。 C中用、-、*、/、%分別表示加、減…