国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

express express-session的使用小結

2019-11-19 12:21:18
字體:
來源:轉載
供稿:網友

簡介

express-session是express中的一個處理session的中間件,可以說是express中最常見的中間件之一了.

由于會話管理依賴cookie的使用,所以它的api中有很多用于控制cookie的部分.

總的來說express-session有如下的特點:

  • session管理(基本功能)
  • cookie簽名
  • 可替換持久儲存模塊

本文中使用的版本為1.15.6.

安裝

npm install express-session --save

引入&使用

const express = require('express');const app = new express();const expressSession = require('express-session');// 使用express-sessionapp.use(expressSession({  secret:'hello world',// cookie簽名 這個屬性是必須的 具體配置和`cookie-parser`一樣  saveUninitialized:true, // 是否自動初始化 默認為true  resave:false,// 當用戶session無變化的時候依然自動保存  cookie:{ // cookie的信息具體操作和`cookie-parser`一樣    maxAge:1800000// 30分鐘后過期  },  rolling:true// 每次請求的時候覆寫cookie}))

會話簡介

在express-session文檔中有如下的一句說明:

Note Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.

Session中包含的數據不會保存在cookie中,僅僅是在cookie中保存了一個SessionId而已.實際的session的數據保存在服務端.

簡單理解就是一個Map,鍵對應的是session id值保存在cookie中,值對應的是用戶保存在服務端的數據.

api介紹

參數

創建express-cookie參數基本分為兩種.

  • 針對于cookie的設置
  • 針對于express-session的設置

cookie設置一覽:

app.use(expressSession({  secret:'hello world', // cookie 簽名必須有否則會報錯  cookie:{    domain:<參數>,    expires:<參數>,    httpOnly:<參數>,    path:<參數>,    sameSite:<參數>,    secure:<參數>,    maxAge:1800000  }}));

而這些對應的參數就是服務端對于cookie的寫入參數,至于各個參數是什么意思參考下面的文章:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie

express-session部分設置:

app.use(expressSession({  secret:'hello world', // cookie 簽名必須有否則會報錯  genid:function (request) { // 用于替換掉默認ID生成的函數 第一個參數為reqeust    return '隨機id'  },  name:'connect.sid',// 每次響應中向cookie中起始的內容,默認起始為`connect.sid`,  proxy:true,// 對于cookie使用secure后,在傳遞的過程中相信反向代理服務器,默認為undefined只相信正向代理  resave:true,// 在一次會話中無論是否session被改變都會進行強制的儲存  rolling:true,// 在每次會話中的響應中都覆寫一次cookie,重置倒計時  saveUninitialized:true,// 將一個新創建還未修改的會話進行儲存,默認為true  store:object// 一個儲存對象,默認使用的是`MemoryStore`這個存儲器  unset:'keep'// 控制沒有設置`req.session`時候的行為(使用delete刪除或者賦值null),默認'keep'會話期間不會保留,'destroy'會話完成后刪除.}));

方法

request.session上掛載的session對象,除了有你添加的內容外,還有默認的方法存在:

req.session.regenerate(function(err) { // 調用這個方法從新生成一個新的會話,完成后觸發})req.session.destroy(function(err) { // 刪除這個會話,完成后觸發})req.session.reload(function(err) { // 從新加載session數據,完成后觸發回調})req.session.save(function(err) { // 使用當前內存中的數據保存到儲存器中 // 默認在會話結束的時候就會自動調用這個方法})req.session.touch() // 更新cookie中的maxAge,一般不需要手動操作,交由中間件

屬性

同樣的在session實例上也有很多屬性:

req.session.id // 保存唯一的會話id值,不可修改req.session.cookie // 以鍵值對的形式保存cookie的原始數據req.session.cookie.maxAge // 以毫秒的形式返回剩余存活時間req.sessionID // 保存唯一的會話id,只讀

一個簡單的例子

一個簡單的登錄例子:

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=123456localhost:8888/localhost:8888/logoutlocalhost:8888/

暗坑

我在chrome瀏覽器下運行上面的例子多次后發現一個問題,瀏覽器會進行預讀取網頁來提高性能,也就是說在瀏覽器中當我url輸入到如下的地方時:

localhost:8888/logo

根據我之間多次進入這個頁面瀏覽器會提前訪問這個頁面localhost:8888/logout,而導致服務器直接刪除session等到真正進入到頁面的時候已經是第二次加載頁面了,導致每次登出都顯示失敗.

希望有經驗的朋友能給出一個合理的解決方案.

注意

express-sessioncookie-parser一起使用的時候對于cookie的簽名必須一致.

express-session的存儲實例是可以更換的,默認使用MemoryStore只適合于測試和開發使用,生產環境必須要使用其他的儲存實例,否則會出現內存碎片問題,在官方文檔中給出了已經實現的接口,可以對接redis以及mongodb等數據庫.

該列表在官方文檔的最后:

npm地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彭泽县| 佛山市| 大名县| 瑞丽市| 徐水县| 嘉定区| 砀山县| 和顺县| 多伦县| 苍山县| 班戈县| 二连浩特市| 黄石市| 文昌市| 祥云县| 西平县| 晋江市| 瓦房店市| 慈溪市| 盐城市| 台州市| 安国市| 德江县| 巨鹿县| 泌阳县| 大邑县| 桃江县| 华池县| 龙川县| 井冈山市| 凤山市| 大同市| 雷州市| 安义县| 闽侯县| 丰镇市| 营山县| 会东县| 龙南县| 高安市| 濮阳县|