無狀態(tài)的 HTTP 協(xié)議
還記得每當(dāng)入門一門 Web 端語(yǔ)言的進(jìn)行服務(wù)器端開發(fā)的時(shí)候,僅次于「Hello World」的 demo 就是「登錄功能」了祈噪。實(shí)現(xiàn)登錄功能很簡(jiǎn)單台妆,驗(yàn)證客戶端發(fā)送過來的賬戶和密碼绽榛,如果通過驗(yàn)證就把用戶塞進(jìn) session 中瞭郑,然后在后續(xù)的訪問中,只需檢測(cè) session 是否有這個(gè)用戶就能知道用戶是否登錄了伍派。Session 的中文翻譯為:「會(huì)話」江耀,只屬于某一個(gè)客戶端和某一個(gè)服務(wù)器端溝通的工具。但,計(jì)算機(jī)網(wǎng)絡(luò)老師又說了,HTTP 協(xié)議是無狀態(tài)的咬崔,怎么能記錄用戶的登錄狀態(tài)呢清焕?
鑒于 HTTP 是無狀態(tài)協(xié)議灯荧,之前已認(rèn)證成功的用戶狀態(tài)是無法通過協(xié)議層面保存下來的,既,無法實(shí)現(xiàn)狀態(tài)管理,因此即使當(dāng)該用戶下一次繼續(xù)訪問壁查,也無法區(qū)分他和其他的用戶。于是我們會(huì)使用 Cookie 來管理 Session剔应,以彌補(bǔ) HTTP 協(xié)議中不存在的狀態(tài)管理功能睡腿。
利用 Cookie 管理 Session
步驟 1:客戶端把用戶 ID 和密碼等登錄信息放入報(bào)文的實(shí)體部分,通常是以 POST 方法把請(qǐng)求發(fā)送給服務(wù)器峻贮。
步驟 2:服務(wù)器會(huì)發(fā)放用以識(shí)別用戶的 Session ID嫉到。通過驗(yàn)證從客戶端發(fā)送過來的登錄信息進(jìn)行身份驗(yàn)證,然后把用戶的認(rèn)證狀態(tài)與 Session ID 綁定后記錄在服務(wù)器端月洛。向客戶端返回響應(yīng)時(shí),會(huì)在首部字段 Set-Cookie 內(nèi)寫入 Session ID孽锥。
步驟 3:客戶端接收到從服務(wù)器端發(fā)來的 Session ID 后嚼黔,會(huì)將其作為 Cookie 保存在本地。下次向服務(wù)器發(fā)送請(qǐng)求時(shí)惜辑,瀏覽器會(huì)自動(dòng)發(fā)送 Cookie唬涧,所以 Session ID 也隨之發(fā)送到服務(wù)器。服務(wù)器端可通過驗(yàn)證接收到的 Session ID 識(shí)別用戶和其認(rèn)證狀態(tài)盛撑。
為 Cookie 服務(wù)的 HTTP 首部字段
- Set-Cookie
- Cookie
Set-Cookie
服務(wù)器管理狀態(tài)使用到的字段碎节,用于響應(yīng)首部
一則響應(yīng)首部的 Set-Cookie 字段:
Set-Cookie: status=enable; expires= Tue, 05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;
Set-Cookie 字段的屬性:
屬性 | 說明 |
---|---|
NAME=VALUE | 賦予 Cookie 的名稱和其值(必須項(xiàng)) |
expires=DATE | Cookie 的有效期(若不明確指定則默認(rèn)為瀏覽器關(guān)閉前為止) |
path=PATH | 將服務(wù)器上的文件目錄作為 Cookie 的適用對(duì)象(若不指定則默認(rèn)為文檔所在的目錄) |
domain=域名 | 作為 Cookie 適用對(duì)象的域名(若不指定則默認(rèn)為創(chuàng)建 Cookie 的服務(wù)器的域名) |
Secure | 僅在 HTTPS 安全通信時(shí)才會(huì)發(fā)送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 Javascript 腳本訪問 |
Cookie
首部字段 Cookie 會(huì)告知服務(wù)器抵卫,當(dāng)客戶端想獲得 HTTP 狀態(tài)管理支持時(shí)狮荔,就會(huì)在請(qǐng)求中包含從服務(wù)器接收到的 Cookie胎撇。接收到多個(gè) Cookie 時(shí),同樣可以以多個(gè) Cookie 形式發(fā)送殖氏。
如果本文對(duì)您有用
請(qǐng)不要吝嗇你們的Follow與Start
這會(huì)大大支持我們繼續(xù)創(chuàng)作
「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080