如何使用sessions在請求之間識別用戶
預設情況下,Express請求是依序處理的,並且無法將請求相互關聯起來。除非使用某種機制來實現,否則無法知道該請求是否來自先前已執行請求的客戶端。
這就是sessions的作用。
一旦實施,您的API或網站的每個用戶將被分配一個唯一的session,這使您可以存儲用戶狀態。
我們將使用由Express團隊維護的express-session
模塊。
您可以使用以下命令進行安裝
npm install express-session
一旦安裝完成,您可以在應用程序中實例化它
const session = require('express-session')
這是一個中間件,所以您需要在Express中安裝它
const express = require('express')
const session = require('express-session')
const app = express()
app.use(session({
'secret': '343ji43j4n3jn4jk3n'
}))
完成後,應用程序路由的所有請求都將使用sessions。
secret
是唯一的必需參數,但還有很多其他可用的參數。它應該是您應用程序的隨機唯一字符串。
session附加到請求上,所以您可以在這裡使用req.session
進行訪問:
app.get('/', (req, res, next) => {
// req.session
}
此對 象可用於從session獲取數據,並用於設置數據:
req.session.name = 'Flavio'
console.log(req.session.name) // 'Flavio'
在存儲時,此數據序列化為JSON,因此您可以安全使用嵌套對象。
您可以使用sessions將數據傳遞給稍後執行的中間件,或者在後續的請求中檢索數據。
會話數據存儲在哪裡?這取決於您如何設置express-session
模塊。
它可以將會話數據存儲在
- 內存,不適用於生產環境
- 如MySQL或Mongo之類的 數據庫
- 如Redis或Memcached之類的 內存緩存
在 https://github.com/expressjs/session 中有一個支持各種不同兼容緩存存儲的第三方包列表
所有解決方案都將會話ID存儲在cookie中,並在服務器端保存數據。客戶端將在cookie中接收會話ID,並將其與每個HTTP請求一起發送。
我們將在服務器端引用這個會話ID,以將其與本地存儲的數據關聯起來。
內存是默認選項,您無需進行特殊設置,但它只適用於開發目的。
最佳選擇是像Redis這樣的內存緩存,您需要設置它自己的基礎架構。
在Express中管理會話的另一個流行包是cookie-session
,它的一大不同之處在於它將數據客戶端存儲在cookie中。我不建議這樣做,因為將數據存儲在cookie中意味著它存儲在客戶端,並在用戶發出的每個請求中來回傳輸。它的大小也受限制,因為它只能存儲4KB的數據。
Cookie還需要進行安全配置,但默認情況下它們並未進行安全配置,因為安全Cookie僅適用於HTTPS站點,如果有代理,則需要對其進行配置。