1.安裝
npm i express-session
2.導入session中間件
const session=require("express-session")
3.?設置中間件
說明:
- 設置了session的名稱為"sid",這是cookie的名稱,默認值是connect.id。
- 設置了一個密鑰"forever",用于對session數據進行加密和簽名。
- 設置了兩個選項:saveUninitialized和resave。saveUninitialized表示是否每次請求自動創建cookie用來存儲session的id,默認值為false;resave表示是否在每次請求時重新保存session,默認值為true。這里設置為true,表示每次請求都會重新保存session。
- 使用了MongoStore作為session存儲方式,將session數據存儲到MongoDB數據庫中。需要提供一個mongoUrl參數,指定數據庫的連接配置。
- 設置了cookie的一些屬性,如httpOnly表示開啟后前端無法通過JS操作獲取cookie,maxAge表示控制sessionID的過期時間,這里設置為5分鐘。
app.use(session({name:"sid", //設置cookie的name,默認值是connect.idsecret:"forever", //參與加密的字符串(又稱簽名)saveUninitialized:false, //是否每次請求自動創建cookie用來存儲session的idresave:true, //是否在每次請求時重新保存session 20分鐘,40分鐘store:MongoStore.create({mongoUrl:'mongodb://127.0.0.1:27017/project' //數據庫的連接配置}),cookie:{httpOnly:true, //開啟后前端無法通過JS操作獲取cookiemaxAge:1000*60*5 //這一條是控制sessionID的過期時間}
}))
?4.session的讀取
app.get("/cart",(req,res)=>{//訪問session對象,從而存儲用戶的關鍵信息//檢測session是否存在用戶數據if(req.session.username){res.send("歡迎來到購物車頁面")}else{res.send("你還沒有登錄")}
})
5.session的銷毀
app.get("/logout",(req,res)=>{req.session.destroy(()=>{res.send("退出成功")})
})
6.源碼展示
const express=require("express")
//導入session中間件
const session=require("express-session")const MongoStore=require("connect-mongo")const app=express()//設置中間件
app.use(session({name:"sid", //設置cookie的name,默認值是connect.idsecret:"forever", //參與加密的字符串(又稱簽名)saveUninitialized:false, //是否每次請求自動創建cookie用來存儲session的idresave:true, //是否在每次請求時重新保存session 20分鐘,40分鐘store:MongoStore.create({mongoUrl:'mongodb://127.0.0.1:27017/project' //數據庫的連接配置}),cookie:{httpOnly:true, //開啟后前端無法通過JS操作獲取cookiemaxAge:1000*60*5 //這一條是控制sessionID的過期時間}
}))
//首頁路由
app.get("/",(req,res)=>{res.send("home")
})
//登錄
app.get("/login",(req,res)=>{// 傳入username=admin&password=adminif(req.query.username==='admin' && req.query.password==='admin'){//設置session信息req.session.username='admin'req.session.sid='258aefccc'// 成功響應res.send("success")}else{res.send("fail")}})
//session的讀取
app.get("/cart",(req,res)=>{//訪問session對象,從而存儲用戶的關鍵信息//檢測session是否存在用戶數據if(req.session.username){res.send("歡迎來到購物車頁面")}else{res.send("你還沒有登錄")}
})//session的銷毀
app.get("/logout",(req,res)=>{req.session.destroy(()=>{res.send("退出成功")})
})app.listen(3000,()=>{console.log("服務啟動成功");
})