cookie和session的工作機(jī)制:
由于cookie保存在客戶端,不能存放敏感信息,而session保存于服務(wù)器端,可用于存放敏感信息。比如對(duì)用戶登錄狀態(tài)的保存。但是http是無狀態(tài)的,session如何保存用戶登錄狀態(tài)呢,當(dāng)用戶登錄成功之后,服務(wù)器端會(huì)將用戶信息對(duì)應(yīng)于一個(gè)session數(shù)據(jù),并將獲取這個(gè)session數(shù)據(jù)的鑰匙發(fā)送給客戶端,而這個(gè)鑰匙在客戶端的保存形式是保存在cookie中,用戶再次訪問當(dāng)前網(wǎng)站的其他網(wǎng)頁的時(shí)候,將cookie信息一起發(fā)送給服務(wù)器,當(dāng)服務(wù)器收到cookie中保存的鑰匙的時(shí)候,查看這個(gè)鑰匙對(duì)應(yīng)的session數(shù)據(jù),從而判斷用戶是否是在登錄狀態(tài)的,如果已經(jīng)登錄,則可以直接訪問,否則跳轉(zhuǎn)到登錄頁。
而在express框架中,默認(rèn)不支持Session和Cookie,但是可以使用第三方中間件express-session來解決
下載:
npm install --save express-session
配置
var session = require('express-session'); # 引入
# 配置中間件
app.use(session({
// 配置加密字符串,會(huì)在原有加密基礎(chǔ)上和這個(gè)字符串拼起來去加密
// 目的是:增加安全性,防止客戶端惡意偽造
secret: 'chen',
resave: true,
// 當(dāng)為false,表示只有使用session,才會(huì)分配鑰匙
// 當(dāng)為true,表示無論是否使用session,都會(huì)分配鑰匙
saveUninitialized: false
}))
使用
#req.session.xx = xx表示設(shè)置session(對(duì)象)
# req.session.xx 表示獲取session數(shù)據(jù)
app.get('/',(req,res) => {
# 當(dāng)訪問/的時(shí)候,設(shè)置當(dāng)前session值,并將session鑰匙回傳給客戶端,保存在客戶端的cookie中
req.session.uname = 'chen';
res.render('index.html',{
name: 'chen'
})
})
app.get('/a',(req,res) => {
// 當(dāng)訪問/a的時(shí)候,獲取session數(shù)據(jù)
console.log(req.session.uname);
res.send('ok');
})