Express全系列教程之(八):session的基本使用

一、關(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信息,再回到首頁顯示為登陸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容