成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

Node實戰:運用Cookie&Session進行登錄驗證

Node實戰:運用Cookie&Session進行登錄驗證

node.js極速入門課程:進入學習

原文地址:https://ailjx.blog.csdn.net/article/details/127909213

作者:海底燒烤店ai

在前面的幾節中我們已經創建并優化好了簡易用戶管理系統的項目結構,也對 Cookie-Session登錄驗證 的工作原理做了講解,接下來我們將繼續補充這個系統的功能,這一節我們將實戰運用Cookie-Session來實現這個系統的登錄驗證功能。【相關教程推薦:nodejs視頻教程】

什么?你還不了解sessioncookie!快去看看上篇文章吧:詳解 Cookie-Session登錄驗證 的工作原理

1️⃣ 定義頁面路由

vies目錄下新建login.ejs

<!DOCTYPE html> <html>  <head>     <meta charset="UTF-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Document</title> </head>  <body>     <h1>登錄頁面</h1>     <div>用戶名:<input type="text" id="username"></div>     <div>密碼:<input type="password" id="password"></div>     <div><button id="login">登錄</button></div>     <script>         const uname = document.getElementById("username");         const pwd = document.getElementById("password");         const login = document.getElementById("login");         login.onclick = () => {             fetch('/api/login', {                 method: 'POST',                 body: JSON.stringify({                     username: uname.value,                     password: pwd.value                 }),                 headers: {                     "Content-Type": "application/json"                 }             }).then(res => res.json()).then(res => {                 // console.log(res);                 if (res.ok) {                     location.href = "/"                 } else {                     alert("用戶名密碼不匹配!")                 }             })         }     </script> </body>  </html>
登錄后復制

注意:頁面中請求的接口是POST /api/login請求

routes目錄下新建login.js,該文件定義login頁面的頁面路由:

var express = require("express"); var router = express.Router();  /* GET login page. */ router.get("/", function (req, res, next) {     res.render("login"); });  module.exports = router;
登錄后復制

app.js中掛載頁面路由:

// 引入 var loginRouter = require("./routes/login"); // 掛載 app.use("/login", loginRouter);
登錄后復制

啟動項目,訪問http://localhost:3000/login正常顯示:

Node實戰:運用Cookie&amp;Session進行登錄驗證

2️⃣ 定義API接口

services/UserService.js中定義接口的模型(M層):

const UserService = { 	// .......     // 登錄查詢     login: (username, password) => {     	// 向數據庫查詢該用戶         return UserModel.findOne({ username, password });     }, };
登錄后復制

controllers/UserController.js中定義接口的控制層(C層):

const UserController = {  	// ......  	// 登錄驗證     login: async (req, res, next) => {         try {             const { username, password } = req.body;             const data = await UserService.login(username, password);             // console.log(data);             if (data) {                 res.send({ ok: 1, msg: "登錄成功!", data });             } else {                 res.send({ ok: 0, msg: "用戶不存在,登錄失敗!" });             }         } catch (error) {             console.log(error);         }     }, };
登錄后復制

routes/users.js中定義Api路由:

// 登錄校驗 router.post("/login", UserController.login);
登錄后復制

至此登錄頁面就搭建好了:

Node實戰:運用Cookie&amp;Session進行登錄驗證

3️⃣ 配置session

在上一節Cookie-Session登錄驗證工作原理的介紹中我們知道:

Node實戰:運用Cookie&amp;Session進行登錄驗證

圖一

這個過程顯然是比較復雜的,在express中有一個express-session模塊可以大大降低我們的工作量,讓我們站在巨人的肩膀上開發!

下載express-session

npm i express-session
登錄后復制

app.js中進行配置:

// 引入express-session var session = require("express-session");  // 配置session:需要放在在路由配置的前面 app.use(     session({         name: "AilixUserSystem", // cookie名字         secret: "iahsiuhaishia666sasas", // 密鑰:服務器生成的session的簽名         cookie: {             maxAge: 1000 * 60 * 60, // 過期時間:一個小時過期             secure: false, // 為true時表示只有https協議才能訪問cookie         },         resave: true, // 重新設置session后會重新計算過期時間         rolling: true, // 為true時表示:在超時前刷新時cookie會重新計時;為false表示:在超時前無論刷新多少次,都是按照第一次刷新開始計時         saveUninitialized: true, // 為true時表示一開始訪問網站就生成cookie,不過生成的這個cookie是無效的,相當于是沒有激活的信用卡     }) );
登錄后復制

配置好后,就會發現瀏覽器中有一個名為AilixUserSystemcookie

Node實戰:運用Cookie&amp;Session進行登錄驗證

這是因為express-session會自動解析cookie和向前端設置cookie,相當于是圖一中的3、6(前半部分:通過SessionId查詢到Session ,我們不再需要手動對cookie進行操作。

4️⃣ 權限驗證

在登錄成功時設置session

// controllers/UserController.js // .... // 登錄校驗 login: async (req, res, next) => {    try {        const { username, password } = req.body;        const data = await UserService.login(username, password);        // console.log(data);        if (data) {            // 設置session:向session對象內添加一個user字段表示當前登錄用戶            req.session.user = data; // 默認存在內存中,服務器一重啟就沒了            res.send({ ok: 1, msg: "登錄成功!", data });        } else {            res.send({ ok: 0, msg: "用戶不存在,登錄失敗!" });        }    } catch (error) {        console.log(error);    } },
登錄后復制

我們向req.session中添加了一個user字段,來保存用戶登錄的信息,這一步相當于是 圖一中的1(SessionId會由express-session模塊自動生成)、2

req.session是一個session對象,需要注意的是這個對象雖然存在于req中,但其實不同的人訪問系統時他們的req.session是不同的,因為 req.session是根據我們設置的cookie(由express-session模塊自動生成的AilixUserSystem )生成的,每一個人訪問系統所生成的cookie是獨一無二的,所以他們的req.session也是獨一無二的。

在收到請求時校驗session,在app.js添加以下代碼:

// 設置中間件:session過期校驗 app.use((req, res, next) => {     // 排除login相關的路由和接口     // 這個項目中有兩個,一個是/login的頁面路由,一個是/api/login的post api路由,這兩個路由不能被攔截     if (req.url.includes("login")) {         next();         return;     }     if (req.session.user) {         // session對象內存在user,代表已登錄,則放行         // 重新設置一下session,從而使session的過期時間重新計算(在session配置中配置了: resave: true)         // 假如設置的過期時間為1小時,則當我12點調用接口時,session會在1點過期,當我12點半再次調用接口時,session會變成在1點半才會過期         // 如果不重新計算session的過期時間,session則會固定的1小時過期一次,無論這期間你是否進行調用接口等操作         // 重新計算session的過期時間的目的就是為了防止用戶正在操作時session過期導致操作中斷         req.session.myData = Date.now();         // 放行         next();     } else {         // session對象內不存在user,代表未登錄         // 如果當前路由是頁面路由,,則重定向到登錄頁         // 如果當前理由是api接口路由,則返回錯誤碼(因為針對ajax請求的前后端分離的應用請求,后端的重定向不會起作用,需要返回錯誤碼通知前端,讓前端自己進行重定向)         req.url.includes("api")             ? res.status(401).send({ msg: "登錄過期!", code: 401 })             : res.redirect("/login");     } });
登錄后復制

注意:這段代碼需要在路由配置的前面。

這段代碼中我們通過req.session.myData = Date.now();來修改session對象,從而觸發session過期時間的更新(sessionmyData這個屬性以及它的值 Date.now()只是我們修改session對象的工具,其本身是沒有任何意義的),你也可以使用其它方法,只要能將req.session修改即可。

因為我們這個項目是后端渲染模板的項目,并不是前后端分離的項目,所以在配置中間件進行session過期校驗攔截路由時需要區分Api路由頁面路由

后端在攔截API路由后,向前端返回錯誤和狀態碼:

Node實戰:運用Cookie&amp;Session進行登錄驗證

這個時候需要讓前端自己對返回結果進行判斷從而進行下一步的操作(如回到登錄頁或顯示彈窗提示),該系統中前端是使用JavaScript內置的fetch來進行請求發送的,通過它來對每一個請求結果進行判斷比較麻煩,大家可以自行改用axios,在axios的響應攔截器中對返回結果做統一的判斷。

5️⃣ 退出登錄

向首頁(index.ejs)添加一個退出登錄的按鈕:

<button id="exit">退出登錄</button>
登錄后復制

為按鈕添加點擊事件:

const exit = document.getElementById('exit')  // 退出登錄 exit.onclick = () => {   fetch("/api/logout").then(res => res.json()).then(res => {     if (res.ok) {       location.href = "/login"     }   }) }
登錄后復制

這里調用了GET /api/logout接口,現在定義一下這個接口,在controllers/UserController.js中定義接口的控制層(C層):

const UserController = {  	// ......     // 退出登錄     logout: async (req, res, next) => {         // destroy方法用來清除cookie,當清除成功后會執行接收的參數(一個后調函數)         req.session.destroy(() => {             res.send({ ok: 1, msg: "退出登錄成功!" });         });     }, };
登錄后復制

routes/users.js中定義Api路由:

// 退出登錄 router.get("/logout", UserController.logout);
登錄后復制

6️⃣ 鏈接數據庫

前面我們通過 req.session.user = data;設置的session默認是存放到內存中的,當后端服務重啟時這些session就會被清空,為了解決這一問題我們可以將session存放到數據庫中。

安裝connect-mongo

npm i connect-mongo
登錄后復制

connect-mongo是MongoDB會話存儲,用于用Typescript編寫的連接Express

修改app.js

// 引入connect-mongo var MongoStore = require("connect-mongo");  // 配置session app.use(     session({         name: "AilixUserSystem", // cookie名字         secret: "iahsiuhaishia666sasas", // 密鑰:服務器生成的session的簽名         cookie: {             maxAge: 1000 * 60 * 60, // 過期時間:一個小時過期             secure: false, // 為true時表示只有https協議才能訪問cookie         },         resave: true, // 重新設置session后會重新計算過期時間         rolling: true, // 為true時表示:在超時前刷新時cookie會重新計時;為false表示:在超時前無論刷新多少次,都是按照第一次刷新開始計時         saveUninitialized: true, // 為true時表示一開始訪問網站就生成cookie,不過生成的這個cookie是無效的,相當于是沒有激活的信用卡         store: MongoStore.create({             mongoUrl: "mongodb://127.0.0.1:27017/usersystem_session", // 表示新建一個usersystem_session數據庫用來存放session             ttl: 1000 * 60 * 60, // 過期時間         }), // 存放數據庫的配置     }) );
登錄后復制

至此,我們就實現了運用Cookie&Session進行登錄驗證/權限攔截的功能!

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
熟交XXXXⅩ欧美老妇妇牲| 色先锋AV资源中文字幕| 人体艺术在线观看| 色88久久久久高潮综合影院| 无码熟妇人妻在线视频| 亚洲爆乳成AV人在线蜜芽| 亚洲中文字幕日产乱码小说| 2020久久天天躁狠狠躁夜夜| FREE性欧美HD另类精品| 国产AⅤ无码专区亚洲AV综合网 | 国产熟女一区二区三区五月婷| 好男人WWW在线观看视频| 久久久久精品国产亚洲AV| 嫩草院一区二区乱码| 日韩人妻无码一区二区三区综合部| 无码人妻精品一区二区三区久久久 | 领导边摸边吃奶边做爽在线观看| 欧美极品少妇XXXXⅩ另类| 色优久久久久综合网鬼色| 亚洲AV无码XXX麻豆艾秋| 永久免费观看午夜成人网站| エロドラえもんCOM中文在线| 国产YEEZY451| 久久精品成人无码观看免费| 欧美肉欲XXⅩOOOHD| 无码熟妇人妻AV影音先锋| 一区二区三区AV波多野结衣| 波多野结衣50连登视频| 国产亚洲午夜高清国产拍精品 | 国产性色ΑV视频免费| 久久中文字幕人妻熟AV女| 日韩AV在线一区二区| 亚洲国产精品无码7777一线| 7777色鬼XXXX欧美色妇| 国产精品久久久爽爽爽麻豆色哟哟| 久久精品国产精品亚洲下载| 人人爽人人澡人人高潮| 亚洲产在线精品亚洲第一站一| 1000部无遮挡拍拍拍免费视频| 国产AV一区二区三区无码野战 | 色天天躁夜夜躁天干天干| 亚洲精品成人区在线观看 | 上边一面亲下边一面膜的注意事项| 亚洲成A人片在线观看无码不卡 | 日韩精品无码观看视频免费| 亚洲不卡AV不卡一区二区| TPU色母和PA6色母的区别| 国产在线乱子伦一区二区| 欧美黑人一区二区| 亚洲AV无码成人影片在线观看| AV天堂午夜精品一区| 国产在线视频一区二区三区| 欧美激情一区二区三区在线| 亚洲AV色香蕉一区二区| TPU色母和PA6色母的区别| 精品国产福利一区二区| 日本VA视频免费在线观看| 亚洲国产婷婷香蕉久久久久久| 宝贝把腿开大让我添添电影| 九九视频免费精品视频| 色欲AV永久无码精品无码| 在线天堂おっさんとわたしWWW| 国产精品国产三级国产AN| 欧美成人免费影片区二区| 亚洲VA国产日韩欧美精品| 成人爽A毛片免费| 久久综合给久久狠狠97色| 无码无遮挡又大又爽又黄的视频| 99久久人妻无码中文字幕系列| 和朋友换娶妻野外夫妇3| 日韩熟妇无码字幕视频毛片| 中国少妇无码专区| 韩国三级在线观看完整版| 日本亚洲色欲网站WWW| 怡红院亚洲第一综合久久| 国产精品无码一区二区在线| 青青草无码精品伊人久久| 亚洲综合另类小说色区色噜噜| 国产交换配乱婬视频偷| 人畜禽CORPORATION| 伊人久久大香线蕉AV影院 | 亚洲AV中文无码乱人伦在线r▽ | 色一乱一伦一图一区二区精品| 中文字幕亚洲欧美专区 | 欧美一级 片内射欧美乱强| 亚洲中文字幕精品久久| 国产美女遭强高潮网站| 日韩精品视频三区| AV片在线观看网站免费| 久久午夜无码鲁丝片秋霞| 亚洲AV高清在线观看一区二区| 东北骚妇老熟女DHXⅩXXX| 欧美成人精品第一区二区三区| 亚洲午夜精品久久久久久浪潮 | 西西午夜无码大胆啪啪国模| 成色好的Y31S标准版| 欧美一区二区三区孕妇精品| 浴室人妻的情欲HD三级| 精品亚洲成a人无码成a在线观看 | 少妇高潮无套内谢麻豆传| AV香港经典A毛片免费观看| 巨大黑人XXXXX高潮后处理| 亚洲精品国偷自产在线99正片| 国产精品一卡二卡三卡四卡| 熟女无套高潮内谢吼叫免费| 锕锕锕锕锕锕好痛WWW在线观看| 免费久久99精品国产自在现| 夜里18款禁用软件APP| 精品久久人人爽人人玩人人妻| 学渣含着学霸几巴的写作业视频| 国产ww又大又粗又刺激孕妇| 色哟哟网站在线观看| 成人亚洲性情网站WWW在线观看| 欧洲精品码一区二区三区| 777琪琪午夜理论电影网| 美日韩一区二区三区| 又湿又紧又大又爽A视频国产| 久久 国产 尿 小便 嘘嘘| 亚洲AV综合色区无码一区| 国产亚洲AV片在线观看播放按摩| 无码人妻精品一区二区桃蜜| 国产成人毛片在线视频 | 欧美人与物VIDEOS另类XX| 2018天天拍拍天天爽视频| 免费观看四虎精品国产地址| 在床上拔萝卜又疼又叫什么病 | 极品粉嫩小泬无遮挡20P| 亚洲AV日韩AV永久无码电影| 国产亚洲精品精华液好用吗| 亚洲AV无码专区亚洲AV伊甸园 | 亚洲精品无码久久久久久| 精品乱码一卡2卡三卡4卡二卡| 亚洲精品国产综合久久一线| 精品熟女少妇AV免费观看| 亚洲无亚洲人成网站77777| 久久久久人妻精品一区| 又粗又大又硬毛片免费看| 免费人成在线观看| AV中文无码乱人伦在线观看| 欧美最猛黑人XXXX黑人猛交9 | 日本熟妇XXⅩ浓密黑毛| 丰满的女房东6剧情| 婷婷五月深爱憿情网六月综合| 国产美女在线精品免费观看| 亚洲成AⅤ人在线观看无码| 久久精品国产亚洲AV麻豆网站| 又大又硬又粗再深一点| 欧美成人精品三级又大又粗| 暴躁老姐的CSGO心得分享| 色婷婷综合久久久中文字幕 | 成年无码AV片在线| 斯诺克直播在线观看高清直播| 国产男男激情VIDEOSGAY| 亚洲精品国产综合久久久久紧| 久久婷婷国产综合精品| 97人妻人人揉人人躁人人| 日本高清视频色WWW色| 国产成人亚洲精品青草| 亚洲AV无码成人专区| 久久久久亚洲AV片无码| AV无码动漫一区二区三区精品 | 国产精品久久久久精品香蕉爆乳 | 久激情内射婷内射蜜桃人妖| 中文字幕久久波多野结衣AV不卡| 人妻 偷拍 无码 中文字幕| 国产成人精品123区免费视频| 亚洲AV无码精品色午夜| 久久亚洲色WWW成人图片| YY4480高清影院播放器| 无码αv人妻一区二区三区| 精品国产亚洲第一区二区三区 | 亚洲欧美中文日韩V在线观看| 么公的粗大挺进了我的密道| 成 人 免费 黄 色 网站视频| 无码少妇一区二区三区视频| 久久九九精品99国产精品| VODAFONEWIFI暴力| 我们还没在书房试过| 久久国产乱子精品免费女| HEZYO东京热无码专区| 无码人妻少妇久久中文字幕蜜桃| 久久国产精品娇妻素人| 拔萝卜高清视频大全免费观看 | 我把英语课代表按在桌子上抄 | 正在播放熟妇群老熟妇456| 日韩精品一区二区三区乱码79| 国产男男猛烈无遮挡A片小说| 伊人性伊人情综合网| 色88久久久久高潮综合影院| 激情综合一区二区三区| AV天堂久久天堂AV色综合| 校花下乡被灌满受孕| 妺妺窝人体色77777777| 国产精品IGAO视频网| 在线天堂8高清版在线观看| 特级做A爰片毛片免费看无码| 久久久久久久精品免费看人女| 成人性欧美丨区二区三区| 亚洲午夜无码片在线观看影院百度| 日韩AⅤ人妻无码一区二区|