久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Node實(shí)戰(zhàn):運(yùn)用Cookie&Session進(jìn)行登錄驗(yàn)證

Node實(shí)戰(zhàn):運(yùn)用Cookie&Session進(jìn)行登錄驗(yàn)證

node.js極速入門課程:進(jìn)入學(xué)習(xí)

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

作者:海底燒烤店ai

在前面的幾節(jié)中我們已經(jīng)創(chuàng)建并優(yōu)化好了簡(jiǎn)易用戶管理系統(tǒng)的項(xiàng)目結(jié)構(gòu),也對(duì) Cookie-Session登錄驗(yàn)證 的工作原理做了講解,接下來(lái)我們將繼續(xù)補(bǔ)充這個(gè)系統(tǒng)的功能,這一節(jié)我們將實(shí)戰(zhàn)運(yùn)用Cookie-Session來(lái)實(shí)現(xiàn)這個(gè)系統(tǒng)的登錄驗(yàn)證功能。【相關(guān)教程推薦:nodejs視頻教程】

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

1️⃣ 定義頁(yè)面路由

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>登錄頁(yè)面</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>
登錄后復(fù)制

注意:頁(yè)面中請(qǐng)求的接口是POST /api/login請(qǐng)求

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

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

app.js中掛載頁(yè)面路由:

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

啟動(dòng)項(xiàng)目,訪問(wèn)http://localhost:3000/login正常顯示:

Node實(shí)戰(zhàn):運(yùn)用Cookie&amp;Session進(jìn)行登錄驗(yàn)證

2️⃣ 定義API接口

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

const UserService = { 	// .......     // 登錄查詢     login: (username, password) => {     	// 向數(shù)據(jù)庫(kù)查詢?cè)撚脩?        return UserModel.findOne({ username, password });     }, };
登錄后復(fù)制

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

const UserController = {  	// ......  	// 登錄驗(yàn)證     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);         }     }, };
登錄后復(fù)制

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

// 登錄校驗(yàn) router.post("/login", UserController.login);
登錄后復(fù)制

至此登錄頁(yè)面就搭建好了:

Node實(shí)戰(zhàn):運(yùn)用Cookie&amp;Session進(jìn)行登錄驗(yàn)證

3️⃣ 配置session

在上一節(jié)Cookie-Session登錄驗(yàn)證工作原理的介紹中我們知道:

Node實(shí)戰(zhàn):運(yùn)用Cookie&amp;Session進(jìn)行登錄驗(yàn)證

圖一

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

下載express-session

npm i express-session
登錄后復(fù)制

app.js中進(jìn)行配置:

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

配置好后,就會(huì)發(fā)現(xiàn)瀏覽器中有一個(gè)名為AilixUserSystemcookie

Node實(shí)戰(zhàn):運(yùn)用Cookie&amp;Session進(jìn)行登錄驗(yàn)證

這是因?yàn)?code>express-session會(huì)自動(dòng)解析cookie和向前端設(shè)置cookie,相當(dāng)于是圖一中的3、6(前半部分:通過(guò)SessionId查詢到Session ,我們不再需要手動(dòng)對(duì)cookie進(jìn)行操作。

4️⃣ 權(quán)限驗(yàn)證

在登錄成功時(shí)設(shè)置session

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

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

req.session是一個(gè)session對(duì)象,需要注意的是這個(gè)對(duì)象雖然存在于req中,但其實(shí)不同的人訪問(wèn)系統(tǒng)時(shí)他們的req.session是不同的,因?yàn)?req.session是根據(jù)我們?cè)O(shè)置的cookie(由express-session模塊自動(dòng)生成的AilixUserSystem )生成的,每一個(gè)人訪問(wèn)系統(tǒng)所生成的cookie是獨(dú)一無(wú)二的,所以他們的req.session也是獨(dú)一無(wú)二的。

在收到請(qǐng)求時(shí)校驗(yàn)session,在app.js添加以下代碼:

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

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

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

因?yàn)槲覀冞@個(gè)項(xiàng)目是后端渲染模板的項(xiàng)目,并不是前后端分離的項(xiàng)目,所以在配置中間件進(jìn)行session過(guò)期校驗(yàn)攔截路由時(shí)需要區(qū)分Api路由頁(yè)面路由

后端在攔截API路由后,向前端返回錯(cuò)誤和狀態(tài)碼:

Node實(shí)戰(zhàn):運(yùn)用Cookie&amp;Session進(jìn)行登錄驗(yàn)證

這個(gè)時(shí)候需要讓前端自己對(duì)返回結(jié)果進(jìn)行判斷從而進(jìn)行下一步的操作(如回到登錄頁(yè)或顯示彈窗提示),該系統(tǒng)中前端是使用JavaScript內(nèi)置的fetch來(lái)進(jìn)行請(qǐng)求發(fā)送的,通過(guò)它來(lái)對(duì)每一個(gè)請(qǐng)求結(jié)果進(jìn)行判斷比較麻煩,大家可以自行改用axios,在axios的響應(yīng)攔截器中對(duì)返回結(jié)果做統(tǒng)一的判斷。

5️⃣ 退出登錄

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

<button id="exit">退出登錄</button>
登錄后復(fù)制

為按鈕添加點(diǎn)擊事件:

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

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

const UserController = {  	// ......     // 退出登錄     logout: async (req, res, next) => {         // destroy方法用來(lái)清除cookie,當(dāng)清除成功后會(huì)執(zhí)行接收的參數(shù)(一個(gè)后調(diào)函數(shù))         req.session.destroy(() => {             res.send({ ok: 1, msg: "退出登錄成功!" });         });     }, };
登錄后復(fù)制

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

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

6️⃣ 鏈接數(shù)據(jù)庫(kù)

前面我們通過(guò) req.session.user = data;設(shè)置的session默認(rèn)是存放到內(nèi)存中的,當(dāng)后端服務(wù)重啟時(shí)這些session就會(huì)被清空,為了解決這一問(wèn)題我們可以將session存放到數(shù)據(jù)庫(kù)中。

安裝connect-mongo

npm i connect-mongo
登錄后復(fù)制

connect-mongo是MongoDB會(huì)話存儲(chǔ),用于用Typescript編寫的連接Express

修改app.js

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

至此,我們就實(shí)現(xiàn)了運(yùn)用Cookie&Session進(jìn)行登錄驗(yàn)證/權(quán)限攔截的功能!

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
91成人在线网站| 国产视频亚洲| 日本欧美一区二区在线观看| 日韩三级视频| 国产极品模特精品一二| 福利一区二区| 女人av一区| 国产精品日韩| 亚洲另类av| 国产伦精品一区二区三区视频| 国产高清精品二区| 中文在线а√天堂| 久久三级视频| 中文字幕一区二区三区日韩精品 | 日韩精品91亚洲二区在线观看| 国产日韩免费| 91一区二区| 久久亚洲精品伦理| 国产精品视频首页| 亚洲无线一线二线三线区别av| 亚洲性视频在线| 国产精品九九| 国产麻豆久久| 亚洲麻豆一区| 在线看片国产福利你懂的| 亚洲综合日本| 麻豆久久一区| 99视频一区| 久久免费视频66| 国产视频一区免费看| 国产精品第一| 六月婷婷一区| 色婷婷色综合| 亚欧洲精品视频在线观看| 国产精品久久久久久久免费观看 | 久久成人高清| 91久久视频| 久久精品一本| 蜜桃一区二区三区在线观看| 欧美黑人做爰爽爽爽| 国产精品日本| av资源新版天堂在线| 亚洲不卡视频| 激情五月色综合国产精品| 欧美a一区二区| 夜夜嗨网站十八久久| 国产aa精品| 日本中文字幕视频一区| 国产99久久| 国产精品4hu.www| 久久国产精品99国产| 四虎8848精品成人免费网站| 亚洲精一区二区三区| 欧美中文一区二区| 国产精品成人**免费视频| 蜜乳av另类精品一区二区| 不卡一二三区| 国产精品2023| 日本在线一区二区三区| 久久伦理在线| 精品少妇av| 国产欧美一区二区三区精品观看 | 水蜜桃久久夜色精品一区的特点| 精品一二三区| 91欧美极品| 噜噜噜久久亚洲精品国产品小说| 日韩在线第七页| 精品国产一区二| 国产精品s色| 91亚洲精品在看在线观看高清| 婷婷亚洲综合| 久久一区二区三区电影| 亚洲黄色中文字幕| 国产精品久久久久久久久久久久久久久 | 另类av一区二区| 日韩精品欧美| 在线中文字幕播放| 精品久久久久中文字幕小说| 国产精品久久久久久久免费软件| 日韩中文一区二区| 99riav1国产精品视频| 亚洲成人不卡| 桃色一区二区| 久久久久蜜桃| 久久久久免费av| 久久人人99| 久久青草久久| av亚洲一区二区三区| av资源中文在线| 色在线中文字幕| 视频小说一区二区| 欧美中文字幕一区二区| 国产综合亚洲精品一区二| 欧美大黑bbbbbbbbb在线| 亚洲激情不卡| 亚洲欧美高清| 蘑菇福利视频一区播放| 在线综合欧美| 日韩在线观看一区二区| 视频一区二区三区在线| 免费在线观看视频一区| 亚洲涩涩av| 日韩中文字幕视频网| 日本欧美久久久久免费播放网| 日韩国产欧美在线视频| 国产乱码精品一区二区三区四区 | 在线综合视频| 99国产精品久久久久久久成人热| 一区在线免费观看| 丝袜脚交一区二区| 日韩极品在线观看| 国产乱子精品一区二区在线观看| 国产精品mv在线观看| 福利一区二区免费视频 | 久久中文欧美| 福利精品一区| 久久久精品午夜少妇| 99热精品在线观看| 天堂va在线高清一区| 麻豆精品av| 精品免费av在线| 视频在线观看一区二区三区| 国产日韩欧美一区二区三区在线观看| 精品在线网站观看| 蜜臀久久99精品久久一区二区| 日本大胆欧美人术艺术动态| 国产免费久久| 久久久国产精品一区二区中文| 国产精品丝袜xxxxxxx| 欧美日韩午夜电影网| 电影91久久久| 在线视频精品| 美日韩一区二区三区| 亚洲国产成人精品女人| 日韩激情视频网站| 国产中文在线播放| 中文在线一区| 国产精品蜜月aⅴ在线| 日韩伦理一区| 蜜桃一区二区三区在线| 麻豆视频一区二区| 99pao成人国产永久免费视频| 国产精品入口久久| 欧美日韩视频一区二区三区| 国产探花一区在线观看| 999国产精品| 欧美日韩99| 亚洲成人日韩| 国产精品mv在线观看| 日韩视频一区| 成人在线视频区| 蜜桃视频在线观看一区二区| а√天堂8资源在线| 日本不卡一二三区黄网| 91精品在线观看国产| 国产精品任我爽爆在线播放| 妖精视频成人观看www| 精品久久在线| 亚洲精品福利| 激情欧美丁香| 麻豆成人91精品二区三区| 日韩专区一卡二卡| 亚洲日本网址| 麻豆国产欧美一区二区三区| 蜜臀久久99精品久久久久久9| 91日韩在线| 日韩av一区二区三区四区| 蜜臀av免费一区二区三区| 精品午夜视频| 欧美午夜网站| 中文字幕一区二区三区四区久久 | 特黄毛片在线观看| 91成人福利| 尤物网精品视频| 在线精品亚洲欧美日韩国产| 国产精品分类| 日韩精品一区二区三区中文字幕| 欧美二区视频| 秋霞国产精品| 精品国产乱码久久久久久1区2匹| 最新国产精品视频| 黑丝一区二区| 99久久九九| 成人久久一区| 在线中文字幕播放| 精品美女在线视频| 欧美国产不卡| 久久超级碰碰| 久久精品 人人爱| 天堂俺去俺来也www久久婷婷| 日韩午夜免费| 午夜日韩在线| 伊人影院久久| 在线亚洲观看| 国产精品毛片在线| 一本色道精品久久一区二区三区| 久久国产电影| 999国产精品999久久久久久| 999久久久91| 四虎884aa成人精品最新|