IC圖片目前的管理系統(tǒng)(搜索質(zhì)量評(píng)估芬探、電銷、云平臺(tái)厘惦、性能監(jiān)控偷仿、賬號(hào)體系、圖片爬蟲)都是基于node前后端全棧開(kāi)發(fā),數(shù)據(jù)存儲(chǔ)也用到mongodb炎疆、mysql、redis国裳,本文簡(jiǎn)單描述一下HTTP協(xié)議形入、cookie、session缝左、以及node項(xiàng)目中如何引入redis做session持久化亿遂。
HTTP協(xié)議和TCP/IP協(xié)議組中其它協(xié)議相同,用于客戶端和服務(wù)器端之間的通信渺杉,HTTP是一種無(wú)狀態(tài)協(xié)議蛇数,及協(xié)議本身不保存客戶端和服務(wù)端的通信狀態(tài),也就是說(shuō)在HTTP這個(gè)級(jí)別是越,協(xié)議不會(huì)對(duì)請(qǐng)求或響應(yīng)做持久化處理,當(dāng)然這也是為了更快的處理大量事務(wù)耳舅,確保協(xié)議的可伸縮性。
1.cookie
為了解決HTTP的無(wú)狀態(tài)倚评,引入了Cookie技術(shù)浦徊,Cookie技術(shù)通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫入cookie信息來(lái)控制客戶端的狀態(tài)。
2.session
為了跟蹤客戶端的狀態(tài)天梧,服務(wù)器端借助于客戶端的cookie和后端存儲(chǔ)實(shí)現(xiàn)的會(huì)話狀態(tài)盔性。所以說(shuō),Session機(jī)制決定了當(dāng)前客戶只會(huì)獲取到自己的Session呢岗,而不會(huì)獲取到別人的Session冕香。
cookie
1.1 概述
在HTTP協(xié)議中,制定了Cookie機(jī)制后豫,用于實(shí)現(xiàn)客戶端和服務(wù)器之間的狀態(tài)共享悉尾。
Cookie是解決HTTP無(wú)狀態(tài)性的有效手段,服務(wù)器可以設(shè)置(set-cookie)或讀取cookie中所包含的信息挫酿。
Cookie是解決HTTP無(wú)狀態(tài)性的有效手段焕襟,服務(wù)器可以設(shè)置(set-cookie)或讀取cookie中所包含的信息。
Cookie是解決HTTP無(wú)狀態(tài)性的有效手段饭豹,服務(wù)器可以設(shè)置(set-cookie)或讀取cookie中所包含的信息鸵赖。
1.2 實(shí)現(xiàn)原理
Cookie定義了HTTP請(qǐng)求頭和HTTP響應(yīng)頭,客戶端和服務(wù)器端通過(guò)這些頭信息進(jìn)行狀態(tài)交互拄衰。
客戶端第一次請(qǐng)求:服務(wù)器端如果需要記錄用戶信息它褪,才會(huì)在響應(yīng)信息中返回 Set-cookie 響應(yīng)頭
客戶端會(huì)根據(jù)響應(yīng)頭存儲(chǔ)Cookie信息
客戶端再次請(qǐng)求:會(huì)在請(qǐng)求頭上帶上存儲(chǔ)的cookie信息,服務(wù)端通過(guò)cookie信息識(shí)別用戶
1.3 cookie 類別
cookie 總是存儲(chǔ)在客戶端(通常指瀏覽器)翘悉,根據(jù)其存儲(chǔ)位置可以分為:內(nèi)存式cookie茫打、硬盤式cookie。
內(nèi)存式:存儲(chǔ)在內(nèi)存中,瀏覽器關(guān)閉后清除老赤,也非持久存儲(chǔ)(會(huì)話cookie)
- cookie 不包含到期日期轮洋,則可視為會(huì)話 cookie。 會(huì)話 cookie 存儲(chǔ)在內(nèi)存中抬旺,決不會(huì)寫入磁盤弊予。 當(dāng)瀏覽器關(guān)閉時(shí),cookie 將從此永久丟失
硬盤式:保存在硬盤中开财,瀏覽器關(guān)閉后不會(huì)清除汉柒,除非手動(dòng)清除或到了過(guò)期時(shí)間,也叫持久存儲(chǔ)(持久cookie)责鳍。
- cookie 包含到期日期碾褂,則可視為持久性 cookie。 在指定的到期日期历葛,cookie 將從磁盤中刪除
注:通常我們可以通過(guò) expires 到期時(shí)間來(lái)做區(qū)分
1.4 HTTP 協(xié)議中為 cookie 服務(wù)的首部字段
Set-cookie: 響應(yīng)首部字段正塌,開(kāi)始狀態(tài)管理所使用的Cookie信息
Cookie: 請(qǐng)求首部字段,服務(wù)端接收到的cookie信息
1.5 cookie-parser
cookie-parser是 node 中用于操作 cookie 的中間件恤溶,用法也比較簡(jiǎn)單传货。
安裝
參數(shù)說(shuō)明
response 設(shè)置的 cookie 信息會(huì)隨HTTP響應(yīng)頭中的set-cookie,返回給客戶端宏娄。
name:cookie 名
value:cookie 值(可以是 json 對(duì)象或字符串)
options:set-cookie選項(xiàng)问裕,[同上圖]
使用
session
概述
Session需要借助Cookie實(shí)現(xiàn),Session數(shù)據(jù)存儲(chǔ)在服務(wù)端孵坚,而只在Cookie中存儲(chǔ)一個(gè)SessionId粮宛,可以保證安全性和降低服務(wù)器負(fù)載。
express-session
express-session真正在服務(wù)端保存數(shù)據(jù)的中間件卖宠,它需要獨(dú)立安裝
安裝
引入
幾個(gè)常用的 options
[圖片上傳中...(image-6b0cf3-1525851935560-5)]
因?yàn)閯?chuàng)建 session 的同時(shí)會(huì)創(chuàng)建 cookie 來(lái)保存 sessionId巍杈,所以 options 中的 cookie.maxAge 可看作是 session 的有效時(shí)長(zhǎng)。
使用
redis
session存在的問(wèn)題:Session用于在服務(wù)端保存用戶會(huì)話狀態(tài)(如:用戶登錄信息等)扛伍,Session在程序重啟筷畦、多進(jìn)程運(yùn)行、負(fù)載均衡刺洒、跨域等情況時(shí)鳖宾,會(huì)出現(xiàn)Session丟失或多進(jìn)程、多個(gè)負(fù)載站點(diǎn)間狀態(tài)不能共享的情況
要解決這些問(wèn)題:我們需要將Session持久化存儲(chǔ)逆航,Redis存儲(chǔ)是一個(gè)非常不錯(cuò)的Session持久化解決方案
Redis是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)
3.1 概述
特點(diǎn)
Redis支持數(shù)據(jù)的持久化鼎文,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用因俐。
Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù)拇惋,同時(shí)還提供list周偎,set,zset撑帖,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)
Redis支持數(shù)據(jù)的備份蓉坎,即master-slave模式的數(shù)據(jù)備份
優(yōu)勢(shì)
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
原子 – Redis的所有操作都是原子性的胡嘿,同時(shí)Redis還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性
3.2 connect-redis
connect-redis是一個(gè) Redis 版的 session 存儲(chǔ)器蛉艾,使用node_redis作為驅(qū)動(dòng)。借助它即可在Express中啟用Redis來(lái)持久化你的Session灶平。
使用之前先搭建好redis環(huán)境和express應(yīng)用伺通,Mac下面非常簡(jiǎn)單箍土,參考:redis搭建/Hello world 示例
安裝
參數(shù)說(shuō)明
client: 你可以復(fù)用現(xiàn)有的redis客戶端對(duì)象逢享, 由redis.createClient() 創(chuàng)建
host: Redis服務(wù)器名
port: Redis服務(wù)器端口
socket: Redis服務(wù)器的unix_socket
ttl: Redis session TTL 過(guò)期時(shí)間 (秒)
disableTTL: 禁用設(shè)置的 TTL
db: 使用第幾個(gè)數(shù)據(jù)庫(kù)
pass: Redis數(shù)據(jù)庫(kù)的密碼
prefix: 數(shù)據(jù)表前輟即schema, 默認(rèn)為 "sess:"
使用
此時(shí):你的session信息就轉(zhuǎn)移到redis數(shù)據(jù)庫(kù)了,當(dāng)應(yīng)用重啟后數(shù)據(jù)仍然可以通過(guò)cookie中的sessionid獲取到吴藻,做到數(shù)據(jù)持久化瞒爬,提高應(yīng)用的健壯性。當(dāng)然你可以嘗試存到其它數(shù)據(jù)庫(kù)里面沟堡,選擇redis在于它極高的性能侧但。
結(jié)語(yǔ)
不管是express-cookie、express-session航罗、connect-redis 都只是node的中間件禀横,使用都非常簡(jiǎn)單,關(guān)鍵點(diǎn)在于理解其中的原理粥血,在不同場(chǎng)景都能很好的應(yīng)用柏锄。