PHP 會話(Session)實現用戶登陸功能

Cookie是一種在客戶端和服務器之間傳遞數據的機制。它是由服務器發送給客戶端的小型文本文件,保存在客戶端的瀏覽器中。每當瀏覽器向同一服務器發送請求時,它會自動將相關的Cookie信息包含在請求中,以便服務器可以使用這些信息來提供個性化的服務。

?

服務器發送Cookie:當服務器發送響應時,可以通過設置響應頭中的Set-Cookie字段來發送Cookie。Set-Cookie字段的值是一個包含Cookie屬性的字符串,例如:

Set-Cookie:?name=value;?Expires=Wed,?21?Oct?2022?07:28:00?GMT;?Path=/
瀏覽器存儲Cookie:一旦瀏覽器接收到帶有Set-Cookie字段的響應,它會將Cookie保存在本地。每個Cookie都與特定的域名相關聯,并且在指定的路徑下有效。

瀏覽器發送Cookie:當瀏覽器向服務器發送請求時,它會自動將與該域相關的所有Cookie包含在請求頭的Cookie字段中,例如:

Cookie:?name=value;?other_cookie=other_value
服務器使用Cookie:服務器在接收到請求后可以通過讀取請求頭的Cookie字段來獲取客戶端發送的Cookie數據,并使用它們進行個性化處理或提供特定的功能。

需要注意的是,Cookie具有一些屬性,如過期時間(Expires或Max-Age),路徑(Path)、域名(Domain)、安全屬性(Secure)等,用于控制Cookie的行為和訪問。此外,瀏覽器還可以為Cookie設置HttpOnly屬性,使得Cookie值無法被JavaScript腳本訪問,從而提高安全性。

?

每次向服務器發出請求時,本地瀏覽器確實會將cookie附帶在請求信息中?。這是因為cookie的工作機制決定了它們會在每次請求時被自動發送到服務器。

Cookie的工作流程和原理

  1. ?生成Cookie?:當瀏覽器首次向服務器發出請求時,服務器會生成一個唯一的標識符(即cookie),并通過響應頭中的Set-Cookie字段發送給瀏覽器。這個cookie通常包含用戶信息,如登錄狀態、個性化設置等?1。
  2. ?存儲Cookie?:瀏覽器收到Set-Cookie字段后,會將cookie存儲在本地。存儲方式可以是內存、硬盤或其他方式,具體取決于瀏覽器的實現?1。
  3. ?發送Cookie?:當瀏覽器再次向服務器發送請求時,會自動在請求頭中添加一個Cookie字段,并將所有存儲在本地的cookie信息包含在內。這樣,服務器就能夠根據這些cookie來識別并獲取用戶的相關信息?1。

Cookie的分類和存儲方式

  1. ?會話cookie?:這種cookie在瀏覽器關閉后即失效。它們通常用于保持用戶會話狀態,如登錄狀態。
  2. ?持久化cookie?:這種cookie可以設置過期時間,在過期時間內即使瀏覽器關閉,cookie信息也會保存并可以在下次訪問時發送給服務器。過期后,cookie將不再發送?2。

瀏覽器對Cookie的控制

瀏覽器可以通過以下方式控制cookie的發送和接收:

  • ?限制第三方cookie?:用戶可以選擇是否允許第三方cookie,這影響廣告跟蹤和其他跨域功能。
  • ?啟用隱私模式?:在隱私模式下,瀏覽器不會保存任何cookie,從而保護用戶的隱私?

session_set_cookie_params() 函數不管刷不刷新頁面,都不會改變cookie的過期時間,

但setcookie() 函數頁面每刷新一次,cookie 的過期時間就會刷新一次。

需要使用session_set_cookie_params()函數來配置session的cookie參數,是因為session的底層實現是基于HTTP cookie機制的。

HTTP cookie是服務器通過響應頭設置在客戶端的一種鍵值對,用于在客戶端存儲數據。當客戶端向服務器發送請求時,瀏覽器會自動將cookie發送給服務器,以幫助服務器識別客戶端身份、存儲用戶的偏好設置、保持用戶的登錄狀態等。

在PHP中,session機制通過設置session ID的cookie來識別客戶端身份和存儲會話數據。而session_set_cookie_params()函數可以用來配置session ID的cookie參數,如過期時間、作用域、安全標志等。

底層原理是,當調用session_start()函數時,PHP會生成一個唯一的session ID,并將該ID存儲在cookie中。通過session_set_cookie_params()函數可以設置cookie的參數,然后通過setcookie()函數將cookie發送給瀏覽器,從而使瀏覽器在后續的請求中自動發送該cookie

因此,通過設置session_set_cookie_params()函數可以控制session ID的cookie的過期時間、作用域、安全標志等,從而增強session的安全性和可控性。

Session儲存于服務器端(默認以文件方式存儲session),根據客戶端提供的session id來得到用戶的文件,取得變量的值,session id可以使用客戶端的Cookie或者Http1.1協議的Query_String(就是訪問的URL的“?”后面的部分)來傳送給服務器,然后服務器讀取Session的目錄……。也就是說,session id是取得存儲在服務上的session變量的身份證。當代碼session_start();運行的時候,就在服務器上產生了一個session文件,隨之也產生了與之唯一對應的一個session id,定義session變量以一定形式存儲在剛才產生的session文件中。通過session id,可以取出定義的變量。跨頁后,為了使用session,你必須又執行session_start();將又會產生一個session文件,與之對應產生相應的session id,用這個session id是取不出前面提到的第一個session文件中的變量的,因為這個session id不是打開它的“鑰匙”。如果在session_start();之前加代碼session_id($session id);將不產生新的session文件,直接讀取與這個id對應的session文件。 按照上面的思想,我只要把session_id存在在cookie中就可以正常使用session了以下是session_set_cookie_params的用法
void   session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )設置與這個session相關聯的session的細節

Session 是存儲在服務器端的,遠程用戶沒辦法修改 Session 文件的內容,因此我們可以單純存儲一個 $admin 變量來判斷是否登陸,首次驗證通過后設置 $admin 值為 true,以后判斷該值是否為 true,假如不是,轉入登陸界面,這樣就可以減少很多數據庫操作了。而且可以減少每次為了驗證 Cookie 而傳遞密碼的不安全性了(Session 驗證只需要傳遞一次,假如你沒有使用 SSL 安全協議的話)。即使密碼進行了 md5 加密,也是很容易被截獲的。

當然使用 Session 還有很多優點,比如控制容易,可以按照用戶自定義存儲等(存儲于數據庫)。我這里就不多說了。

Session 在 php.ini 是否需要設置呢?一般不需要的,因為并不是每個人都有修改 php.ini 的權限,默認 Session 的存放路徑是服務器的系統臨時文件夾,我們可以自定義存放在自己的文件夾里,這個稍后我會介紹。

<?php
//  表單提交后...
$posts = $_POST;
//  清除一些空白符號
foreach ($posts as $key => $value) {$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"]; $query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'";
//  取得查詢結果
$userInfo = $DB->getRow($query); if (!empty($userInfo)) {//  當驗證通過后,啟動 Sessionsession_start();//  注冊登陸成功的 admin 變量,并賦值 true$_SESSION["admin"] = true;
} else {die("用戶名密碼錯誤");
}
?>

<?php
//  防止全局變量造成安全隱患
$admin = false;
//  啟動會話,這步必不可少
session_start();
//  判斷是否登陸
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {echo "您已經成功登陸";
} else {//  驗證失敗,將 $_SESSION["admin"] 置為 false$_SESSION["admin"] = false;die("您無權訪問");
}
?>
<?php
session_start();
//  這種方法是將原來注冊的某個變量銷毀
unset($_SESSION['admin']);
//  這種方法是銷毀整個 Session 文件
session_destroy();
?>

Session 是如何來判斷客戶端用戶的呢?它是通過 Session ID 來判斷的,什么是 Session ID,就是那個 Session 文件的文件名,Session ID 是隨機生成的,因此能保證唯一性和隨機性,確保 Session 的安全。一般如果沒有設置 Session 的生存周期,則 Session ID 存儲在內存中,關閉瀏覽器后該 ID 自動注銷,重新請求該頁面后,重新注冊一個 Session ID。

如果客戶端沒有禁用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是存儲 Session ID 和 Session 生存期的角色。

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

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

相關文章

PAT 甲級 1090 Highest Price in Supply Chain

構造一個二維數組 v &#xff0c;v[i] 存放指向 i 的所有元素。 構造隊列 q 存放每個待讀取的節點。 構造數組 high 存放每個節點的高度&#xff08;第幾級經銷商&#xff09; #include<iostream> #include<queue> #include<cmath> using namespace std; …

DeepSeek掘金——SpringBoot 調用 DeepSeek API 快速實現應用開發

Spring Boot 實現 DeepSeek API 調用 1. 項目依賴 在 pom.xml 中添加以下依賴: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…

算法——數學建模的十大常用算法

數學建模的十大常用算法在數學建模競賽和實際問題解決中起著至關重要的作用。以下是這些算法的具體信息、應用場景以及部分算法的C語言代碼示例&#xff08;由于篇幅限制&#xff0c;這里只給出部分算法的簡要代碼或思路&#xff0c;實際應用中可能需要根據具體問題進行調整和擴…

推薦幾款SpringBoot項目手腳架

作為程序員、一般需要搭建項目手腳架時、都會去Gitee或Github上去找、但是由于Github在國內并不穩定、所以就只能去Gitee去上查找。 不同語言檢索方式不一樣、但是也類似。 Gitee WEB應用開發 / 后臺管理框架 芋道源碼 ELADMIN 后臺管理系統 一個基于 Spring Boot 2.7.1…

智能自動化新紀元:AI與UiPath RPA的協同應用場景與技術實踐

智能自動化新紀元&#xff1a;AI與UiPath RPA的協同應用場景與技術實踐 引言 在數字化轉型的浪潮中&#xff0c;企業對于自動化技術的需求已從簡單的任務執行轉向更復雜的智能決策。傳統RPA&#xff08;Robotic Process Automation&#xff09;通過模擬人類操作處理重復性任務…

數據結構:動態數組vector

vector 是 C 標準庫的動態數組。 在C語言中一般初學者會使用malloc&#xff0c;int[n]等方式來創建靜態數組&#xff0c;但是這種方式繁瑣且容易出錯。我們做算法題一般使用動態數組vector&#xff0c; 并且在刷題網站的題目給的輸入一般也是vector類型。 示例&#xff1a;vect…

基于深度學習的信號濾波:創新技術與應用挑戰

一、引言 1.1 研究背景 隨著科技的不斷發展&#xff0c;信號處理領域面臨著越來越復雜的挑戰。在眾多信號處理技術中&#xff0c;基于深度學習的信號濾波技術逐漸嶄露頭角&#xff0c;成為研究的熱點。 基于深度學習的信號濾波在信號處理領域具有至關重要的地位。如今&#…

前端八股——JS+ES6

前端八股&#xff1a;JSES6 說明&#xff1a;個人總結&#xff0c;用于個人復習回顧&#xff0c;將持續改正創作&#xff0c;已在語雀公開&#xff0c;歡迎評論改正。

醫院安全(不良)事件上報系統源碼,基于Laravel8開發,依托其優雅的語法與強大的擴展能力

醫院安全&#xff08;不良&#xff09;事件上報系統源碼 系統定義&#xff1a; 規范醫院安全&#xff08;不良&#xff09;事件的主動報告&#xff0c;增強風險防范意識&#xff0c;及時發現醫院不良事件和安全隱患&#xff0c;將獲取的醫院安全信息進行分析反饋&#xff0c;…

H3C交換機路由器防火墻FTP/TFTP服務器搭建。

軟件介紹。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多種網絡服務功能的工具軟件&#xff0c;主要用于網絡管理和文件傳輸&#xff0c;支持TFTP、FTP、Syslog等多種協議&#xff0c;廣泛應用于網絡設備的配置和管理。 1. 主要功能 TFTP服務器&#xff1a;支持TFTP協議…

數據庫連接管理--Java連接數據庫的幾種方式

1.數據庫連接管理 1.1 使用JDBC獲取連接 JDBC是Java標準庫提供的API&#xff0c;用于連接和操作關系型數據庫。它是最基礎、最常用的數據庫連接方式。 步驟&#xff1a; 加載數據庫驅動。建立連接。創建Statement或PreparedStatement對象。執行SQL查詢或更新。處理結果集。關…

如何使用Spring boot框架實現圖書管理系統

使用 Spring Boot 框架實現圖書管理系統可以按照以下步驟進行&#xff0c;涵蓋了從項目搭建、數據庫設計、后端接口開發到前端頁面展示的整個流程。 1. 項目搭建 可以使用 Spring Initializr&#xff08;https://start.spring.io/ &#xff09;來快速創建一個 Spring Boot 項目…

【網絡安全 | 漏洞挖掘】賬戶接管+PII+原漏洞繞過

文章目錄 前言正文前言 本文涉及的所有漏洞測試共耗時約三周,成果如下: 訪問管理面板,成功接管目標列出的3000多家公司。 獲取所有員工的真實指紋、機密文件及個人身份信息(PII)。 繞過KYC認證,成功接管電話號碼。 繞過此前發現的漏洞。 正文 在測試目標時,我發現了一…

深度學習學習筆記(34周)

目錄 摘要 Abstracts 簡介 Hourglass Module&#xff08;Hourglass 模塊&#xff09; 網絡結構 Intermediate Supervision&#xff08;中間監督&#xff09; 訓練過程細節 評測結果 摘要 本周閱讀了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…

JVM類文件結構深度解析:跨平臺基石與字節碼探秘

目錄 一、類文件&#xff1a;Java生態的通用語言 1.1 字節碼的橋梁作用 1.2 類文件核心優勢 二、類文件二進制結構剖析 2.1 整體結構布局 2.2 魔數與版本控制 2.3 常量池&#xff1a;類文件的資源倉庫 2.4 訪問標志位解析 三、核心數據結構詳解 3.1 方法表結構 3.2 …

wps中zotero插件消失,解決每次都需要重新開問題

參考 查看zotero目錄 D:\zotero\integration\word-for-windows 加載項點擊 dotm即可 長期解決 把dom 復制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN還是每次都需要重新開的話 重新加載一下

如何設計合理的樹狀結構表:平衡查詢效率與維護效率

樹狀結構廣泛應用于數據建模中&#xff0c;例如 商品分類、組織架構、權限管理 等場景。合理設計樹形結構的數據庫表&#xff0c;能夠有效提升 查詢效率 和 維護效率。本文將探討如何在設計時平衡這兩者&#xff0c;詳細介紹常用的幾種樹狀結構存儲方式及其適用場景。 一、樹狀…

List 接口中的 sort 和 forEach 方法

List 接口中的 sort 和 forEach 方法是 Java 8 引入的兩個非常實用的函數&#xff0c;分別用于 排序 和 遍歷 列表中的元素。以下是它們的詳細介紹和用法&#xff1a; sort 函數 功能 對列表中的元素進行排序。 默認使用自然順序&#xff08;如數字從小到大&#xff0c;字符…

深度學習驅動的車牌識別:技術演進與未來挑戰

一、引言 1.1 研究背景 在當今社會&#xff0c;智能交通系統的發展日益重要&#xff0c;而車牌識別作為其關鍵組成部分&#xff0c;發揮著至關重要的作用。車牌識別技術廣泛應用于交通管理、停車場管理、安防監控等領域。在交通管理中&#xff0c;它可以用于車輛識別、交通違…

GitCode 助力至善云學:構建智慧教育平臺

項目倉庫&#xff1a; 前端&#xff1a;https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client 后端&#xff1a;https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server 突破傳統教學困境&#xff0c;探索教育新解法 傳統教學的習題講評環節&#xff0c;教師面臨著難以…