一、關(guān)于session
session是另一種記錄客戶狀態(tài)的機(jī)制,與cookie保存在客戶端瀏覽器不同,session保存在服務(wù)器當(dāng)中;
當(dāng)客戶端訪問服務(wù)器時(shí),服務(wù)器會(huì)生成一個(gè)session對(duì)象,對(duì)象中保存的是key:value值,同時(shí)服務(wù)器會(huì)將key傳回給客戶端的cookie當(dāng)中;當(dāng)用戶第二次訪問服務(wù)器時(shí),就會(huì)把cookie當(dāng)中的key傳回到服務(wù)器中,最后服務(wù)器會(huì)吧value值返回給客戶端。
因此上面的key則是全局唯一的標(biāo)識(shí),客戶端和服務(wù)端依靠這個(gè)全局唯一的標(biāo)識(shí)來訪問會(huì)話信息數(shù)據(jù)。
二、設(shè)置session
我們使用express-session模塊來設(shè)置session
1.安裝express-session
cnpm install express-session --save
2.引入express-session模塊
const session=require("express-session");
3.設(shè)置session
session(options);
如下列代碼:
const express=require("express");
const session=require("express-session");
var app=express();
//配置中間件
app.use(session({
????secret: "keyboard cat",
????resave: false,
????saveUninitialized: true,
????cookie: ('name', 'value',{maxAge:? 5*60*1000,secure: false})
}));
app.use('/login',function(req,res){
????//設(shè)置session
????req.session.userinfo='張三';
????res.send("登陸成功!");
});
app.use('/',function(req,res){
????//獲取session
????if(req.session.userinfo){
????????res.send("hello "+req.session.userinfo+",welcome");
????}else{
????????res.send("未登陸");
? ? ?}
});
app.listen(8080);
在session(option)中對(duì)session進(jìn)行設(shè)置,它的主要參數(shù)是:
1. name - cookie的名字(原屬性名為 key)。(默認(rèn):’connect.sid’)
2. store - session存儲(chǔ)實(shí)例
3. secret - 用它來對(duì)session cookie簽名,防止篡改
4. cookie - session cookie設(shè)置 (默認(rèn):{ path: ‘/‘, httpOnly: true,secure: false, maxAge: null })
5. genid - 生成新session ID的函數(shù) (默認(rèn)使用uid2庫)
6. rolling - 在每次請(qǐng)求時(shí)強(qiáng)行設(shè)置cookie,這將重置cookie過期時(shí)間(默認(rèn):false)
7. resave - 強(qiáng)制保存session即使它并沒有變化 (默認(rèn): true, 建議設(shè)為:false)
8. proxy - 當(dāng)設(shè)置了secure cookies(通過”x-forwarded-proto” header )時(shí)信任反向代理。當(dāng)設(shè)定為true時(shí),
”x-forwarded-proto” header 將被使用。當(dāng)設(shè)定為false時(shí),所有headers將被忽略。當(dāng)該屬性沒有被設(shè)定時(shí),將使用Express的trust proxy。
9. saveUninitialized - 強(qiáng)制將未初始化的session存儲(chǔ)。當(dāng)新建了一個(gè)session且未設(shè)定屬性或值時(shí),它就處于未初始化狀態(tài)。在設(shè)定一個(gè)cookie前,這對(duì)于登陸驗(yàn)證,減輕服務(wù)端存儲(chǔ)壓力,權(quán)限控制是有幫助的。(默認(rèn):true)
10. unset - 控制req.session是否取消(例如通過 delete,或者將它的值設(shè)置為null)。這可以使session保持存儲(chǔ)狀態(tài)但忽略修改或刪除的請(qǐng)求(默認(rèn):keep)
三、session的常用方法
//設(shè)置session
req.session.username="張三"
//獲取session
req.session.username
//重新設(shè)置cookie的過期時(shí)間
req.session.cookie.maxAge=1000;
//銷毀session
req.session.destroy(function(err){
})
以下演示通過銷毀session的方式來退出登錄:
const express=require("express");
const session=require("express-session");
var app=express();
//配置中間件
app.use(session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true,
cookie: ('name', 'value',{ maxAge:? 5*60*1000,
secure: false,
name: "seName",
resave: false})
}));
app.use('/login',function(req,res){
//設(shè)置session
req.session.userinfo='張三';
res.send("登陸成功!");
});
app.use('/loginOut',function(req,res){
//注銷session
req.session.destroy(function(err){
res.send("退出登錄!"+err);
});
});
app.use('/',function(req,res){
//獲取session
if(req.session.userinfo){
res.send("hello "+req.session.userinfo+",welcome to index");
}else{
res.send("未登陸");
}
});
app.listen(8080);
當(dāng)我們進(jìn)入到主頁時(shí),未顯示任何信息,進(jìn)入login路由后,自動(dòng)設(shè)置session,這是回到主頁則顯示session信息,之后進(jìn)入loginOut路由已注銷session信息,再回到首頁顯示為登陸。