摘要:簡介是中的一個(gè)處理的中間件可以說是中最常見的中間件之一了由于會(huì)話管理依賴的使用所以它的中有很多用于控制的部分總的來說有如下的特點(diǎn)管理基本功能簽名可替換持久儲(chǔ)存模塊本文中使用的版本為安裝引入使用使用簽名這個(gè)屬性是必須的具體配置和
簡介
express-session是express中的一個(gè)處理session的中間件,可以說是express中最常見的中間件之一了.
由于會(huì)話管理依賴cookie的使用,所以它的api中有很多用于控制cookie的部分.
總的來說express-session有如下的特點(diǎn):
session管理(基本功能)
cookie簽名
可替換持久儲(chǔ)存模塊
本文中使用的版本為1.15.6.
安裝npm install express-session --save引入&使用
const express = require("express"); const app = new express(); const expressSession = require("express-session"); // 使用express-session app.use(expressSession({ secret:"hello world",// cookie簽名 這個(gè)屬性是必須的 具體配置和`cookie-parser`一樣 saveUninitialized:true, // 是否自動(dòng)初始化 默認(rèn)為true resave:false,// 當(dāng)用戶session無變化的時(shí)候依然自動(dòng)保存 cookie:{ // cookie的信息具體操作和`cookie-parser`一樣 maxAge:1800000// 30分鐘后過期 }, rolling:true// 每次請求的時(shí)候覆寫cookie }))會(huì)話簡介
在express-session文檔中有如下的一句說明:
Note Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.
Session中包含的數(shù)據(jù)不會(huì)保存在cookie中,僅僅是在cookie中保存了一個(gè)SessionId而已.實(shí)際的session的數(shù)據(jù)保存在服務(wù)端.
簡單理解就是一個(gè)Map,鍵對應(yīng)的是session id值保存在cookie中,值對應(yīng)的是用戶保存在服務(wù)端的數(shù)據(jù).
api介紹 參數(shù)創(chuàng)建express-cookie參數(shù)基本分為兩種.
針對于cookie的設(shè)置
針對于express-session的設(shè)置
cookie設(shè)置一覽:
app.use(expressSession({ secret:"hello world", // cookie 簽名必須有否則會(huì)報(bào)錯(cuò) cookie:{ domain:<參數(shù)>, expires:<參數(shù)>, httpOnly:<參數(shù)>, path:<參數(shù)>, sameSite:<參數(shù)>, secure:<參數(shù)>, maxAge:1800000 } }));
而這些對應(yīng)的參數(shù)就是服務(wù)端對于cookie的寫入?yún)?shù),至于各個(gè)參數(shù)是什么意思參考下面的文章:
https://developer.mozilla.org...
express-session部分設(shè)置:
app.use(expressSession({ secret:"hello world", // cookie 簽名必須有否則會(huì)報(bào)錯(cuò) genid:function (request) { // 用于替換掉默認(rèn)ID生成的函數(shù) 第一個(gè)參數(shù)為reqeust return "隨機(jī)id" }, name:"connect.sid",// 每次響應(yīng)中向cookie中起始的內(nèi)容,默認(rèn)起始為`connect.sid`, proxy:true,// 對于cookie使用secure后,在傳遞的過程中相信反向代理服務(wù)器,默認(rèn)為undefined只相信正向代理 resave:true,// 在一次會(huì)話中無論是否session被改變都會(huì)進(jìn)行強(qiáng)制的儲(chǔ)存 rolling:true,// 在每次會(huì)話中的響應(yīng)中都覆寫一次cookie,重置倒計(jì)時(shí) saveUninitialized:true,// 將一個(gè)新創(chuàng)建還未修改的會(huì)話進(jìn)行儲(chǔ)存,默認(rèn)為true store:object// 一個(gè)儲(chǔ)存對象,默認(rèn)使用的是`MemoryStore`這個(gè)存儲(chǔ)器 unset:"keep"http:// 控制沒有設(shè)置`req.session`時(shí)候的行為(使用delete刪除或者賦值null),默認(rèn)"keep"會(huì)話期間不會(huì)保留,"destroy"會(huì)話完成后刪除. }));方法
在request.session上掛載的session對象,除了有你添加的內(nèi)容外,還有默認(rèn)的方法存在:
req.session.regenerate(function(err) { // 調(diào)用這個(gè)方法從新生成一個(gè)新的會(huì)話,完成后觸發(fā) })
req.session.destroy(function(err) { // 刪除這個(gè)會(huì)話,完成后觸發(fā) })
req.session.reload(function(err) { // 從新加載session數(shù)據(jù),完成后觸發(fā)回調(diào) })
req.session.save(function(err) { // 使用當(dāng)前內(nèi)存中的數(shù)據(jù)保存到儲(chǔ)存器中 // 默認(rèn)在會(huì)話結(jié)束的時(shí)候就會(huì)自動(dòng)調(diào)用這個(gè)方法 })
req.session.touch() // 更新cookie中的maxAge,一般不需要手動(dòng)操作,交由中間件屬性
同樣的在session實(shí)例上也有很多屬性:
req.session.id // 保存唯一的會(huì)話id值,不可修改 req.session.cookie // 以鍵值對的形式保存cookie的原始數(shù)據(jù) req.session.cookie.maxAge // 以毫秒的形式返回剩余存活時(shí)間 req.sessionID // 保存唯一的會(huì)話id,只讀一個(gè)簡單的例子
一個(gè)簡單的登錄例子:
const express = require("express"); const app = new express(); const expressSession = require("express-session"); const userDb = new Map(); app.use(expressSession({ secret:"hello world", saveUninitialized:true, resave:false, cookie:{ maxAge:1800000 }, rolling:true, })); app.get("/login", (request, response) => { const id = request.query.id, pwd = request.query.pwd; if(id && pwd){ if(userDb.has(id+pwd)){ response.send("該用戶已登錄"); }else{ request.session.userId = id+pwd; userDb.set(id+pwd,id); response.redirect("/"); } }else{ response.send("請輸入正確的帳號和密碼"); } }); app.get("/logout",(request, response)=>{ const userId = request.session.userId; request.session.destroy((err)=>{ if(err || !userDb.has(userId)){ response.send("登出失敗"); }else{ userDb.delete(userId); response.send("登出成功"); } }); }); app.get("/",(request, response)=>{ if(request.session.userId && userDb.has(request.session.userId)){ response.send(`歡迎回來${userDb.get(request.session.userId)}`); }else{ response.send("還未登錄"); } }); app.use((request, response) => { response.send("404 not found"); }); app.listen(8888, "127.0.0.1");
在瀏覽器中依次輸入以下url來模擬登錄行為:
localhost:8888/ localhost:8888/login?id=ASCll&pwd=123456 localhost:8888/ localhost:8888/logout localhost:8888/暗坑
我在chrome瀏覽器下運(yùn)行上面的例子多次后發(fā)現(xiàn)一個(gè)問題,瀏覽器會(huì)進(jìn)行預(yù)讀取網(wǎng)頁來提高性能,也就是說在瀏覽器中當(dāng)我url輸入到如下的地方時(shí):
localhost:8888/logo
根據(jù)我之間多次進(jìn)入這個(gè)頁面瀏覽器會(huì)提前訪問這個(gè)頁面localhost:8888/logout,而導(dǎo)致服務(wù)器直接刪除session等到真正進(jìn)入到頁面的時(shí)候已經(jīng)是第二次加載頁面了,導(dǎo)致每次登出都顯示失敗.
希望有經(jīng)驗(yàn)的朋友能給出一個(gè)合理的解決方案.
注意當(dāng)express-session和cookie-parser一起使用的時(shí)候?qū)τ?b>cookie的簽名必須一致.
express-session的存儲(chǔ)實(shí)例是可以更換的,默認(rèn)使用MemoryStore只適合于測試和開發(fā)使用,生產(chǎn)環(huán)境必須要使用其他的儲(chǔ)存實(shí)例,否則會(huì)出現(xiàn)內(nèi)存碎片問題,在官方文檔中給出了已經(jīng)實(shí)現(xiàn)的接口,可以對接redis以及mongodb等數(shù)據(jù)庫.
該列表在官方文檔的最后:
npm地址
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99914.html
摘要:簡介在我的前一篇小文中小書提到了可以更換會(huì)話儲(chǔ)存那么這篇文章我們就來講講在進(jìn)行會(huì)話管理的時(shí)候如何將會(huì)話數(shù)據(jù)保存在外部數(shù)據(jù)庫中本文中我們使用用作會(huì)話儲(chǔ)存數(shù)據(jù)庫本文中使用的模塊以及版本號一覽模塊名稱版本號特性支持支持所有版本的支持支持 簡介 在我的前一篇小文中express-session小書提到了express-session可以更換會(huì)話儲(chǔ)存. 那么這篇文章我們就來講講express在進(jìn)...
摘要:簡介在我的前一篇小文中小書提到了可以更換會(huì)話儲(chǔ)存那么這篇文章我們就來講講在進(jìn)行會(huì)話管理的時(shí)候如何將會(huì)話數(shù)據(jù)保存在外部數(shù)據(jù)庫中本文中我們使用用作會(huì)話儲(chǔ)存數(shù)據(jù)庫本文中使用的模塊以及版本號一覽模塊名稱版本號特性支持支持所有版本的支持支持 簡介 在我的前一篇小文中express-session小書提到了express-session可以更換會(huì)話儲(chǔ)存. 那么這篇文章我們就來講講express在進(jìn)...
摘要:通過瀏覽器的,可以看到此次會(huì)話的請求內(nèi)容和響應(yīng)內(nèi)容。是協(xié)議的一部分。真實(shí)的產(chǎn)品,一般是創(chuàng)建一個(gè)保證唯一的,不易猜測出來的字符串。因此需要數(shù)據(jù)持久化的多提供者的方案。 使用過幾種Web App開發(fā)語言和框架,都會(huì)接觸到Session的概念。即使是一個(gè)簡單站點(diǎn)訪問計(jì)數(shù)的功能,也常常使用Session來實(shí)現(xiàn)的。其他常用的領(lǐng)域還有購物車,登錄用戶等。但是,對Session一直是一知半解,知其然...
摘要:默認(rèn)鏈接錯(cuò)誤其他中間件省略默認(rèn)小時(shí)全局中間件第一次登陸從數(shù)據(jù)庫中比對賬號驗(yàn)證是否成功,如成功保存用戶信息登陸成功需要登陸驗(yàn)證的路由獲取文章你好,歡迎來到我的家園。你還沒有登錄,先登錄下再試試個(gè)人項(xiàng)目小博客鏈接參考文章 redis.js var ioRedis = require(ioredis); var logger = require(./logger); var redis = ...
摘要:為用戶提供授權(quán)以允許用戶操作非公開資源,有很多種方式。具體的代碼根據(jù)不同的授權(quán)方案而有所不同。使用授權(quán)原理利用來驗(yàn)證用戶,有兩種機(jī)制實(shí)現(xiàn)。使用來實(shí)現(xiàn)用戶授權(quán)主要用于簽發(fā)如果有將異步的簽名。 ? 在很多應(yīng)用中,我們都需要向服務(wù)端提供自己的身份憑證來獲得訪問一些非公開資源的授權(quán)。比如在一個(gè)博客平臺,我們要修改自己的博客,那么服務(wù)端要求我們能夠證明 我是我 ,才會(huì)允許我們修改自己的...
閱讀 1529·2021-11-18 10:02
閱讀 1680·2021-09-04 16:40
閱讀 3180·2021-09-01 10:48
閱讀 882·2019-08-30 15:55
閱讀 1860·2019-08-30 15:55
閱讀 1379·2019-08-30 13:05
閱讀 3022·2019-08-30 12:52
閱讀 1632·2019-08-30 11:24