我們邊吃曲奇邊聊——Cookie與Session那些事

Cookie與Session分別是什么?

HTTP Cookie(也叫 Web Cookie 或瀏覽器 Cookie)是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。

通常,它用于告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登錄狀態。

Cookie 使基于無狀態的HTTP協議記錄穩定的狀態信息成為了可能。

Cookie 主要用于以下三個方面:

  1. 會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)
  2. 個性化設置(如用戶自定義設置、主題等)
  3. 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

能夠方便一下用戶,這也是Cookie名稱的由來,給用戶的一點甜頭。


Session 代表著服務器和客戶端一次會話的過程。

Session 對象存儲特定用戶會話所需的屬性及配置信息。

這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。

當客戶端關閉會話,或者 Session 超時失效時會話結束。

Cookie與Session的區別

-CookieSession
作用范圍保存在客戶端(瀏覽器)保存在服務器端
存取方式只能保存 ASCII可以存任意數據類型,一般情況下我們可以在 Session 中保持一些常用變量信息,比如說 UserId 等
有效期可設置為長時間保持,比如我們經常使用的默認登錄功能一般失效時間較短,客戶端關閉或者 Session 超時都會失效
隱私策略存儲在客戶端,比較容易遭到不法獲取,早期有人將用戶的登錄名和密碼存儲在 Cookie 中導致信息被竊取存儲在服務端,安全性相對 Cookie 要好一些
存儲大小單個 Cookie 保存的數據不能超過 4KBSession 可存儲數據遠高于 Cookie

Cookie和Session的關聯

為什么需要 Cookie 和 Session,他們有什么關聯?

說起來為什么需要 Cookie ,這就需要從瀏覽器開始說起,我們都知道瀏覽器是沒有狀態的(HTTP 協議無狀態),這意味著瀏覽器并不知道是張三還是李四在和服務端打交道。這個時候就需要有一個機制來告訴服務端,本次操作用戶是否登錄,是哪個用戶在執行的操作,那這套機制的實現就需要 Cookie 和 Session 的配合。

那么 Cookie 和 Session 是如何配合的呢?

用戶第一次請求服務器的時候,服務器根據用戶提交的相關信息,創建創建對應的 Session ,請求返回時將此 Session 的唯一標識信息 SessionID 返回給瀏覽器,瀏覽器接收到服務器返回的 SessionID 信息后,會將此信息存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬于哪個域名。

當用戶第二次訪問服務器的時候,請求會自動判斷此域名下是否存在 Cookie 信息,如果存在自動將 Cookie 信息也發送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查找對應的 Session 信息,如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經登錄可執行后面操作。

根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統也是根據此原理來驗證用戶登錄狀態。

Cookie被禁止的解決方案

既然服務端是根據 Cookie 中的信息判斷用戶是否登錄,那么如果瀏覽器中禁止了 Cookie,如何保障整個機制的正常運轉?有兩種解決方案:

  1. 每次請求中都攜帶一個 SessionID 的參數,也可以 Post 的方式提交,也可以在請求的地址后面拼接 xxx?SessionID=123456…。
  2. Token 機制。Token 機制多用于 App 客戶端和服務器交互的模式,也可以用于 Web 端做用戶狀態管理。

Token 的意思是“令牌”,是服務端生成的一串字符串,作為客戶端進行請求的一個標識。Token 機制和 Cookie 和 Session 的使用機制比較類似。

當用戶第一次登錄后,服務器根據提交的用戶信息生成一個 Token,響應時將 Token 返回給客戶端,以后客戶端只需帶上這個 Token 前來請求數據即可,無需再次登錄驗證。

分布式Session

在互聯網公司為了可以支撐更大的流量,后端往往需要多臺服務器共同來支撐前端用戶請求,那如果用戶在 A 服務器登錄了,第二次請求跑到服務 B 就會出現登錄失效問題。

分布式 Session 一般會有以下幾種解決方案:

  1. Nginx ip_hash 策略,服務端使用 Nginx 代理,每個請求按訪問 IP 的 hash 分配,這樣來自同一 IP 固定訪問一個后臺服務器,避免了在服務器 A 創建 Session,第二次分發到服務器 B 的現象。
  2. Session 復制,任何一個服務器上的 Session 發生改變(增刪改),該節點會把這個 Session 的所有內容序列化,然后廣播給所有其它節點。
  3. 共享 Session,服務端無狀態話,將用戶的 Session 等信息使用緩存中間件來統一管理,如Redis,保障分發到每一個服務器的響應結果都一致。

建議采用第三種方案。

參考資料

COOKIE和SESSION有什么區別?

90%的程序員都沒有完全回答對 Cookie 和 Session 的區別?

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

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

相關文章

mysql 不能添加外鍵 1215_MySQL錯誤1215:無法添加外鍵約束

我正在嘗試將新模式轉發工程到我的數據庫服務器上,但是我不知道為什么會收到此錯誤。我試圖在這里搜索答案,但是我發現的所有內容都說是將db引擎設置為Innodb或確保要用作外鍵的鍵是它們自己表中的主鍵。如果我沒記錯的話,我都做過這兩件事。…

JMH初體驗

什么是JMH JMH是 Java Microbenchmark Harness 的縮寫。中文意思大致是 “JAVA 微基準測試套件”。 基準測試是指通過設計科學的測試方法、測試工具和測試系統,實現對一類測試對象的某項性能指標進行定量的和可對比的測試。——百度百科 為什么要使用 JMH 基準測試…

java map取第一個元素_Java Set接口 Map 與枚舉

Set接口概述一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,并且最多包含一個 null 元素特點Set接口是無序的 Set 是繼承于Collection的接口。它是一個不允許有重復元素的集合。Set可以存儲null值,但是nu…

Python中yield簡單用法

Python中yield簡單用法 你或許知道帶有yield的函數在Python中被稱之為generator,那何為 generator? 我們暫時拋開generator,先從一個常見編程題目開始,循序漸進了解yield的概念。 生成Fibonacci數列 Fibonacci數列是一個經典遞…

js 用下標獲取map值_js map方法處理返回數據,獲取指定數據簡寫方法

map方法處理返回數據,獲取指定數據簡寫方法前言后端返回數據為數組列表時,通常比較全面,包含了很多不需要的數據,可以通過 map 方法處理返回數據,篩選出想要的數據例如// 返回數據res [{id: 1,name: zhangsan,age: 16…

《Python Cookbook 3rd》筆記匯總

文章目錄一、數據結構二、字符串和文本三、數字、日期和時間四、迭代器與生成器五、文件與IO一、數據結構 標題關鍵詞1.1:拆分序列后賦值給多個變量可迭代對象、拆分賦值1.2:拆分任意長可迭代對象后賦值給多個變量可迭代對象、拆分賦值、星號表達式1.3&…

mysql hp ux_hp ux apa 切換

(HP-UX Only) OR - 1 heartbeat network using APA with 2 trunk members (HP-UX Only) OR - 1 heartbeat network with serial line (HP-UX Only) OR......一、 概述 HP 的 APA 軟件提供兩種網卡冗余切換模式,用以實現網絡高可用性...0x000000000000 hp_apa HP-UX 11i v3 Prer…

Python中[:]與[::]的用法

Python中[:]與[::]的用法 概述 [:]與[::]語法是通用序列操作(Common Sequence Operations)其中的兩個。用[:]或[::]對多數序列類型(可變的或不可變的)(如字符串、列表等)序列中元素進行截取。 [:]的用法…

mysql redis 中間件_Docker快速搭建Mysql社區版,Redis,MongoDb、MQ等等中間件。

一:安裝docker社區版。Centos系列(最好用7以上的版本,docker需要3.1以上的linux內核版本)sudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl start dockersudo docker run hello-world如果你敲docker info需要root密碼,…

JavaScript中String的slice(),substr(),substring()三者區別

JavaScript中String的slice(),substr(),substring()三者區別 共同之處 從給定的字符串中截取片段,并返回全新的這片段的字符串對象,且不會改動原字符串。 具體不同之處 slice() str.slice(beginIndex[, endIndex])參數描述be…

pythontuple數據類型_數據類型-元組Tuple

Python Tuple用于存儲不可變python對象的序列。元組類似于列表,因為可以改變列表中存儲的項的值,而元組是不可變的,并且不能改變存儲在元組中的項的值。元組可以寫成用小括號括起來的逗號分隔值的集合。元組可以定義如下。T1 (101, "Ay…

《劍指Offer》24:反轉鏈表

題目 定義一個函數,輸入一個鏈表的頭節點,反轉鏈表并輸出反轉后鏈表的頭節點。鏈表節點定義如下: public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 方法一&#xff1…

python兩個for循環為什么第二個循環里值不變_兩個for循環,第二個只在第一個迭代python上執行...

我是一個pythonnoob,我試圖比較兩個文件中的行之間的值,如果行在第二個文件中,則輸出“line name”,然后輸出1;如果第二個文件中缺少該行,則輸出0。第一次迭代返回1,因為該行在第二個文件中&…

python如何問問題_學會正確的提問

可能很多讀者看到這個標題會感覺很可笑,提問誰不會啊,互聯網時代,提問還不是一句話的事情?個人、技術群、論壇里都可以提問啊,「你好」「在嗎?」「有人用過 xx 工具嗎?」。首先,提問…

如何保證接口的冪等性

如何保證接口的冪等性 什么是冪等性 冪等性是系統服務對外一種承諾,承諾只要調用接口成功,外部多次調用對系統的影響是一致的。聲明為冪等的服務會認為外部調用失敗是常態,并且失敗之后必然會有重試。 通俗地說,接口冪等性就是…

mysql二進制方式_MySQL數據庫之MySql二進制連接方式詳解

本文主要向大家介紹了MySQL數據庫之MySql二進制連接方式詳解 ,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。使用mysql二進制方式連接您可以使用MySQL二進制方式進入到mysql命令提示符下來連接MySQL數據庫。實例以下是從命令行中連接my…

xposed模塊編寫教程_太極xposed模塊使用教程

今天給大家分享一下太極xposed模塊使用教程。很多小伙伴說下載不到Xposed模塊,這個網上其實很多,但是第三方的下載站就算了吧。我也是一個深受其害的網癮少年,只要是下載站的軟件,一不留心一次性電腦可能會多安裝好多個軟件&#…

如何使用mysql添加更新_Mysql 存在既更新,不存在就添加(sql語句)

討人喜歡的 MySQL replace into 用法(insert into 的增強版)在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。在 SQL Server 中可以這樣處理…

linux + nginx + mysql + php 百度網盤_5.LNMP(Linux + Nginx + MySQL + PHP)環境安裝

1.安裝Nginx:yum install yum-priorities -ywget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmrpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpmyum -y install nginxsystemctl start nginx.servicesystemctl stop ngin…

LeetCode - Easy - 28. Implement strStr()

Topic Two Pointers, String Description https://leetcode.com/problems/implement-strstr/ Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. needle /?ni?dl/ n.針 haystack /?he?…