session是另外一種記錄客戶狀態的機制,與cookie保存在客戶端瀏覽器不一樣,session保存在服務器當中;
當客戶端訪問服務器時,服務器會生成一個session對象,對象中保存的是key:value值,同時服務器會將key傳回給客戶端的cookie當中;當用戶第二次訪問服務器時,就會把cookie當中的key傳回到服務器中,最後服務器會吧value值返回給客戶端。
所以上面的key則是全局惟一的標識,客戶端和服務端依靠這個全局惟一的標識來訪問會話信息數據。express
咱們使用express-session模塊來設置sessionnpm
1.安裝express-session瀏覽器
cnpm install express-session --save
2.引入express-session模塊服務器
const session=require("express-session");
3.設置sessioncookie
session(options);
以下列代碼: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}) })); app.use('/login',function(req,res){ //設置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)中對session進行設置,它的主要參數是:app
1. name - cookie的名字(原屬性名爲 key)。(默認:’connect.sid’) 2. store - session存儲實例 3. secret - 用它來對session cookie簽名,防止篡改 4. cookie - session cookie設置 (默認:{ path: ‘/‘, httpOnly: true,secure: false, maxAge: null }) 5. genid - 生成新session ID的函數 (默認使用uid2庫) 6. rolling - 在每次請求時強行設置cookie,這將重置cookie過時時間(默認:false) 7. resave - 強制保存session即便它並無變化 (默認: true, 建議設爲:false) 8. proxy - 當設置了secure cookies(經過」x-forwarded-proto」 header )時信任反向代理。當設定爲true時, 」x-forwarded-proto」 header 將被使用。當設定爲false時,全部headers將被忽略。當該屬性沒有被設定時,將使用Express的trust proxy。 9. saveUninitialized - 強制將未初始化的session存儲。當新建了一個session且未設定屬性或值時,它就處於未初始化狀態。在設定一個cookie前,這對於登錄驗證,減輕服務端存儲壓力,權限控制是有幫助的。(默認:true) 10. unset - 控制req.session是否取消(例如經過 delete,或者將它的值設置爲null)。這可使session保持存儲狀態但忽略修改或刪除的請求(默認:keep)
req.session.username="張三" //獲取session req.session.username //從新設置cookie的過時時間 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){ //設置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);
當咱們進入到主頁時,未顯示任何信息,進入login路由後,自動設置session,這是回到主頁則顯示session信息,以後進入loginOut路由已註銷session信息,再回到首頁顯示爲登錄。ui