前言:redis
http是一個無狀態協議,因此客戶端每次發出請求時,下一次請求就沒法得知上一次請求所包含的狀態數據,那麼如何能把一個用戶的狀態數據關聯起來?
1.cookiemongodb
一開始,人們採用cookie這門技術來解決這個問題,cookie是http協議中的一部分,它的處理過程以下:數據庫
1)服務器像客戶端發送cookieexpress
一般採用http協議規定的set-cookie頭操做瀏覽器
規範規定cookie的格式爲name=value的格式,且必須包含這部分緩存
2)瀏覽器將cookie保存安全
3)瀏覽器每次請求時都會將cookie發給服務器服務器
2.sessioncookie
採用cookie的方式有一個很大的弊端,cookie中的全部數據再客戶端就能夠被修改,很不安全,那麼一些重要的數據就不能存放在cookie中,因而就產生了session.而session中的數據是保存再服務端的,比較安全.session
session經過一個特殊字段來與瀏覽器的cookie創建鏈接.
在express中,這個特殊字段默認是connet.sid.當請求到來時,服務端檢查cookie中保存的connet.sid中的值,並經過這個值與服務器端的session的數據關聯起來.這樣瀏覽器與用戶狀態數據經過connect.sid這個新的字段來關聯,客戶端就沒法修改保存在session中的用戶狀態了.
1)session存放方式
session的存放方式,分別是存放在:內存,cookie自己,緩存,數據庫(也能夠是文件),其中內存的存放方式適用於開發調試,內存的存放方式不方便進程間的共享,大多數應用都是採用緩存的方式來存儲cookie.也有使用數據庫的方式的,這種方式有一個大的缺點就是速度慢,在小型網站中,好比我的學習項目能夠採用.
2)session的redis存儲
redis既能夠當作數據庫來使用,也能夠做爲緩存來使用.
express中操做session要用到express-session,這個模塊的使用方法,session(options),其中options中包含的可選參數主要有:
naem:設置cookie中,保存session的字段名稱(默認爲connect.sid)
store:session的存儲方式,若是不使用該選項,則默認存放再內存中.
cookie:設置存放session id的cookie的相關選項,若是不使用該選項,則默認爲:
cookie: { path: '/', //表示cookie影響的路徑,這裏默認影響全部路徑 _expires: null, //時間格式 originalMaxAge: null, //cookie保存時間 httpOnly: true } } //通常狀況下設置爲true(默認)
rolling:每個請求都從新設置一個cookie,默認爲false
resave:及時session沒有被修改,也保存session,默認true
以下再redis中存儲session:
const express = require('express'); const session = require('express-session'); const RedisStore = require('connect-redis')(session); let app = express() app.use(session({ name: "qqqqqq", secret: 'wwwww', store: new RedisStore({ host: '127.0.0.1', port: 6379 }), resave: true, saveUninitialized: true, cookie:{ 'maxAge':6000 } }))
2)使用mongodb數據庫存儲session,相似redis
const express = require('express') const session = require('express-session') const MongoStore = require('connect-mongo')(session) .... app.use(session({ name: config.session.key, //設置cookie中保存session id的字段名稱 secret: config.session.secret, //經過secret來計算hash值並放在cookie中 cookie: { maxAge: config.session.maxAge //過時時間,過時後cookie中的session id自動刪除 }, store: new MongoStore({ //將session存儲到mongodb url: config.mongodb //mongodb地址 }) })) ....