AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Express-Session:SessionId 機制驅動的一個 Express 會話數據存儲庫

來源: 責編: 時間:2023-12-12 17:01:50 232觀看
導讀Express 是一個 Node.js 的 Web 框架,提供對外服務器的功能。中間件則是 Express 提供的一種擴展能力的插件機制。express-session 就是 Express 的一個中間件。使用 sessionId 的機制,為用戶在網站訪問期間,提供會話數

Express 是一個 Node.js 的 Web 框架,提供對外服務器的功能。中間件則是 Express 提供的一種擴展能力的插件機制。v2b28資訊網——每日最新資訊28at.com

express-session 就是 Express 的一個中間件。使用 sessionId 的機制,為用戶在網站訪問期間,提供會話數據的存儲支持。v2b28資訊網——每日最新資訊28at.com

技術實現上,express-session 就是為每個用戶生成唯一的一個 sessionId(默認通過名為 connect.sid 的 cookie 字段)并存儲在服務器上。在后續請求往返間,后端通過這個 sessionId 就能拿到之前存儲的數據,實現用戶訪問狀態的記憶。v2b28資訊網——每日最新資訊28at.com

注意:會話數據的存儲往往會借助文件系統或者數據庫系統(生產上通常叫緩沖數數據庫,比如 redis)等。express-session 管數據存儲叫 Store,默認使用的是內存(MemoryStore),不過生產上并不推薦。v2b28資訊網——每日最新資訊28at.com

圖片圖片v2b28資訊網——每日最新資訊28at.com

安裝 & 簡單使用

express-session 依賴 express,因此使用時需要保證 express 也存在。v2b28資訊網——每日最新資訊28at.com

$ npm install express express-session

下面是一個簡單的使用。v2b28資訊網——每日最新資訊28at.com

var express = require('express')var session = require('express-session')var app = express()app.use(session({  secret: 'keyboard cat',  resave: false,  saveUninitialized: true}))

secret 是必填項,作為生成 sessio ID  的鹽值。resave、saveUninitialized 都是選填項,不過由于這 2 個選項的默認值會在未來版本修改,因此官方推薦顯式傳入。v2b28資訊網——每日最新資訊28at.com

express-session 是通過中間件方式注入到 express 應用中的。經 express-session 處理后的請求實例 req 都包含一個 .session 屬性,我們是通過在 .session 屬性上存儲信息,實現前后請求會話數據的保存的。v2b28資訊網——每日最新資訊28at.com

以下,我們將通過 2 個復雜一點的案例來介紹 express-session 的使用。v2b28資訊網——每日最新資訊28at.com

案例介紹

這里舉了 2 個例子,一個是統計用戶頁面訪問次數,還有一個是用戶登錄的例子。v2b28資訊網——每日最新資訊28at.com

統計頁面訪問次數

我們先亮代碼(不是很多)。v2b28資訊網——每日最新資訊28at.com

var express = require('express')var session = require('express-session')var app = express()// 1)app.use(session({  secret: 'keyboard cat',  resave: false,  saveUninitialized: true}))app.use(function (req, res, next) {  // 2)  if (!req.session.views) {    req.session.views = {}  }  // get the url pathname  var pathname = req.path  // 3)  // count the views  req.session.views[pathname] = (req.session.views[pathname] || 0) + 1  next()})app.get('/foo', function (req, res, next) {  res.send('you viewed this page ' + req.session.views['/foo'] + ' times')})app.get('/bar', function (req, res, next) {  res.send('you viewed this page ' + req.session.views['/bar'] + ' times')})app.listen(3000)

這里我們起了一個監聽在 3000 端口的服務器,對訪問 /foo、/bar 頁面的次數做了統計。v2b28資訊網——每日最新資訊28at.com

  1. 首先express(session({ ... })) 一下,做好會話存儲準備,調用后,會在每一次請求(req)添加一個 .session 對象屬性
  2. 頁面訪問數據存儲在 req.session.views 對象屬性上,初次訪問時是沒有這個對象的,就創建({})
  3. 接下來獲取某個訪問路徑下(req.path)的訪問次數(+1),結束

用戶登錄

用戶登錄是一個稍微復雜一點的例子,分登錄和退出,我們拆開來講。v2b28資訊網——每日最新資訊28at.com

首先,我們針對用戶登錄和未登錄狀態來區別顯示首頁內容:v2b28資訊網——每日最新資訊28at.com

  • 用戶已登錄狀態下,顯示用戶名、暴露退出入口
  • 用戶未登錄狀態下,顯示登錄表單,登錄請求發送至 /login

以下是代碼實現:v2b28資訊網——每日最新資訊28at.com

var escapeHtml = require('escape-html')var express = require('express')var session = require('express-session')var app = express()// 1)app.use(session({  secret: 'keyboard cat',  resave: false,  saveUninitialized: true}))// 2.1) middleware to test if authenticatedfunction isAuthenticated (req, res, next) {  if (req.session.user) next()  else next('route')}// 2)app.get('/', isAuthenticated, function (req, res) {  // this is only called when there is an authentication user due to isAuthenticated  res.send('hello, ' + escapeHtml(req.session.user) + '!' +    ' <a href="/logout">Logout</a>')})// 3)app.get('/', function (req, res) {  res.send('<form actinotallow="/login" method="post">' +    'Username: <input name="user"><br>' +    'Password: <input name="pass" type="password"><br>' +    '<input type="submit" text="Login"></form>')})// ...app.listen(3000)

這里我們起了一個監聽在 3000 端口的服務器,根據登錄狀態處理首頁展示邏輯。v2b28資訊網——每日最新資訊28at.com

  1. 還是老樣子,首先express(session({ ... })) 一下,做好會話存儲準備,這一步會在每一次請求(req)添加一個 .session 對象屬性
  2. 先跑第一個 / 路徑邏輯,這一步會先經過 isAuthenticated 中間件校驗
  1. 用戶登錄后,我們會創建一個 req.session.user 屬性存儲是用戶數據,isAuthenticated 是檢查這個屬性又沒有的,有  req.session.user 話,就說明登陸了,展示用戶信息(next());沒有  req.session.user 的話,說明未登錄,則忽略用戶信息展示,跳轉至下一個路由處理(next('route'),也就是第 3 步)
  1. 經過上一步,到這一步說明用戶未登錄,我們就發送一個登錄表單,讓用戶填寫。登錄表單包含 user、pass 字段信息。

接下來,我們來看看 /login 頁面的處理邏輯。v2b28資訊網——每日最新資訊28at.com

// ...// 1)app.post('/login', express.urlencoded({ extended: false }), function (req, res) {  // login logic to validate req.body.user and req.body.pass  // would be implemented here. for this example any combo works  // regenerate the session, which is good practice to help  // guard against forms of session fixation  // 1)  req.session.regenerate(function (err) {    if (err) next(err)    // store user information in session, typically a user id    // 2)    req.session.user = req.body.user    // save the session before redirection to ensure page    // load does not happen before session is saved    // 3)    req.session.save(function (err) {      if (err) return next(err)      // 4)      res.redirect('/')    })  })})// ...
  1. 為了能正確處理 <form> 表單提交數據,我們使用 express.urlencoded({ extended: false }) 中間件將 form 表單數據收集到 req.body 上
  2. 我們一上來并沒有立即對 req.body.user/req.body.pass 進行校驗,而是調用了 req.session.regenerate() 重新生成用戶會話 sessionId,這能避免會話固定攻擊(session fixation attack)
  3. 接下來,為了做簡單演示,我們沒有校驗密碼,而是直接將提交的用戶名存儲下來(req.session.user = req.body.user)
  4. 在重定向會首頁之前,我們又調用了 req.session.save() 將新 sessionId 下的 user 信息同步給 Store(默認是緩存,實際生產往往是一個緩存數據庫(像 redis))
  5. 最后,重定到首頁,這時候頁面就顯示登錄用戶名了

再來看看退出登錄(/logout)的邏輯。v2b28資訊網——每日最新資訊28at.com

app.get('/logout', function (req, res, next) {  // logout logic  // clear the user from the session object and save.  // this will ensure that re-using the old sessionId  // does not have a logged in user  // 1)  req.session.user = null  // 2)  req.session.save(function (err) {    if (err) next(err)    // regenerate the session, which is good practice to help    // guard against forms of session fixation    // 3)    req.session.regenerate(function (err) {      if (err) next(err)      // 4)      res.redirect('/')    })  })})
  1. 首先,我們將 req.session.user 置為空
  2. 然后,req.session.save() 將上面的修改同步到 Store
  3. 接著,通過調用  req.session.regenerate() 重新生成 sessionId,這塊跟登錄一樣,是為了避免會話固定攻擊
  4. 最后,重定到首頁,這時候頁面就未登錄狀態下的登錄框了

總結

express-session 是用來為 express 框架提供會話緩存支持的一個中間件。技術上是通過使用 sessionId 機制提供會話記憶支持的。v2b28資訊網——每日最新資訊28at.com

本文分別列舉了 2 個案例來說明 express-session 的使用:訪問次數和用戶登錄。不過需要注意的是,不管是登錄還是退出,都要有一個新生成 sessionId 的過程(req.session.regenerate()),這是為了避免會話固定攻擊。v2b28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-43315-0.htmlExpress-Session:SessionId 機制驅動的一個 Express 會話數據存儲庫

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: WebStorm 2023.3 來了,更好用,更智能!

下一篇: 前端發起異步請求受瀏覽器同源策略限制,導致跨域問題

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業務到 2022 年底還是 0,希望 2023 年出來一個 1。&rdquo;這是2022年底,李彥宏
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • AMD的AI芯片轉單給三星可能性不大 與臺積電已合作至2nm制程

    據 DIGITIMES 消息,英偉達 AI GPU 出貨逐季飆升,接下來 AMD MI 300 系列將在第 4 季底量產。而半導體業內人士表示,近日傳出 AMD 的 AI 芯片將轉單給
Top