Adresse originale : https://ailjx.blog.csdn.net/article/details/127909213
Auteur : Undersea BBQ Restaurant ai
Dans les sections précédentes, nous avons créé et optimisé la structure simple du projet du système de gestion des utilisateurs explique également le principe de fonctionnement de la Cookie-Vérification de connexion par session
. Ensuite, nous continuerons à compléter les fonctions de ce système. Dans cette section, nous utiliserons Cookie en pratique -. Session
pour implémenter la fonction de vérification de connexion de ce système. [Tutoriels associés recommandés : tutoriel vidéo nodejs]Cookie-Session登录验证
的工作原理做了讲解,接下来我们将继续补充这个系统的功能,这一节我们将实战运用Cookie-Session
来实现这个系统的登录验证功能。【相关教程推荐:nodejs视频教程】
什么?你还不了解session
、cookie
!快去看看上篇文章吧:详解 Cookie-Session登录验证 的工作原理
在vies
目录下新建login.ejs
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
注意:页面中请求的接口是
POST /api/login
请求
在routes
目录下新建login.js
,该文件定义login
页面的页面路由:
1 2 3 4 5 6 7 8 9 |
|
在app.js
中挂载页面路由:
1 2 3 4 |
|
启动项目,访问http://localhost:3000/login
正常显示:
在services/UserService.js
中定义接口的模型(M层):
1 2 3 4 5 6 7 8 |
|
在controllers/UserController.js
中定义接口的控制层(C层):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
在routes/users.js
中定义Api
路由:
1 2 |
|
至此登录页面就搭建好了:
在上一节Cookie-Session
登录验证工作原理的介绍中我们知道:
这个过程显然是比较复杂的,在express
中有一个express-session
模块可以大大降低我们的工作量,让我们站在巨人的肩膀上开发!
下载express-session
:
1 |
|
在app.js
中进行配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
配置好后,就会发现浏览器中有一个名为AilixUserSystem
的cookie
:
这是因为express-session
会自动解析cookie
和向前端设置cookie
,相当于是Pratique du nœud : utilisation de Cookie&Session pour la vérification de la connexion中的3、6(前半部分:通过SessionId
查询到Session
) ,我们不再需要手动对cookie
进行操作。
在登录成功时设置session
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
我们向req.session
中添加了一个user
字段,来保存用户登录的信息,这一步相当于是 Pratique du nœud : utilisation de Cookie&Session pour la vérification de la connexion中的1(SessionId会由express-session
模块自动生成)、2。
req.session
是一个session
对象,需要注意的是这个对象虽然存在于req
中,但其实不同的人访问系统时他们的req.session
是不同的,因为req.session
是根据我们设置的cookie
(由express-session
模块自动生成的AilixUserSystem
)生成的,每一个人访问系统所生成的cookie
是独一无二的,所以他们的req.session
也是独一无二的。
在收到请求时校验session
,在app.js
添加以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
注意:这段代码需要在路由配置的前面。
这段代码中我们通过req.session.myData = Date.now();
来修改session
对象,从而触发session
过期时间的更新(session
上myData
这个属性以及它的值 Date.now()
只是我们修改session
对象的工具,其本身是没有任何意义的),你也可以使用其它方法,只要能将req.session
session
, cookie
! Allez lire l'article précédent : Explication détaillée du principe de fonctionnement de la vérification de connexion Cookie-Session🎜login.ejs
dans le répertoire vies
: 🎜 1 |
|
POST /api/login
🎜🎜🎜Créez un nouveau login.js
dans les routes</code > répertoire. Ce fichier Définissez le parcours de la page <code>login
: 🎜1 2 3 4 5 6 7 8 9 10 |
|
app.js
: 🎜1 2 3 4 5 6 7 8 9 10 |
|
http://localhost : 3000/login
Affichage normal : 🎜🎜services/UserService. js
Définir le modèle de l'interface (Clayer) : 🎜1 2 |
|
controllers/ UserController.js
: 🎜1 |
|
Api
dans routes/users.js
: 🎜1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Cookie-Session
, nous savons : 🎜🎜< img src="https://img .php.cn/upload/article/000/000/024/1b42c38e8a44134933674f4d93952f08-3.png" alt="Image 1"/>🎜express-session
dans code>express qui peut réduire considérablement notre charge de travail et nous permettre de nous tenir sur les épaules de géants en développement ! 🎜🎜Télécharger express-session
: 🎜rrreee🎜Configurer dans app.js
: 🎜rrreee🎜Après la configuration, vous trouverez un navigateur nommé < cookie</code > du code>AilixUserSystem
: 🎜🎜express-session
analysera automatiquement le cookie
et définira cookie
sur le front-end. Équivalent à 3 et 6 dans la figure 1 (la première moitié : interroger Session
via SessionId
), nous n'avons plus besoin de vérifier manuellement le cookie
pour fonctionner. 🎜session
lorsque la connexion est réussie : 🎜rrreee🎜Nous demander Un champ user
est ajouté à req.session
pour enregistrer les informations de connexion de l'utilisateur. Cette étape est équivalente à 1 dans la figure 1 (SessionId sera modifié par Le module express-session génère automatiquement), 2
. 🎜🎜🎜req.session
est un objet session
Il est à noter que bien que cet objet existe dans req
, il est en réalité accessible par différents utilisateurs. personnes. Leur req.session
est différent lors de l'exécution du système, car req.session
est basé sur le cookie
que nous avons défini (par Le <code>AilixUserSystem
généré automatiquement par le module express-session Le cookie
généré par chaque personne qui accède au système est unique, donc. leur req.session
est également unique. 🎜🎜🎜Vérifiez session
lors de la réception d'une demande, ajoutez le code suivant dans app.js
: 🎜rrreee🎜🎜Remarque : Ce code doit être devant la configuration de routage . 🎜🎜🎜Dans ce code, nous modifions l'objet session
via req.session.myData = Date.now();
, déclenchant ainsi session
La mise à jour du délai d'expiration (myData
sur session
et sa valeur Date.now()
sont juste nous qui modifions session</code >Outil Objet, <strong>en lui-même n'a aucune signification</strong>), vous pouvez également utiliser d'autres méthodes, à condition que <code>req.session
puisse être modifié. 🎜因为我们这个项目是后端渲染模板的项目,并不是前后端分离的项目,所以在配置中间件进行session
过期校验拦截路由时需要区分Api路由
和页面路由
。
后端在拦截API路由后,向前端返回错误和状态码:
这个时候需要让前端自己对返回结果进行判断从而进行下一步的操作(如回到登录页或显示弹窗提示),该系统中前端是使用JavaScript
内置的fetch
来进行请求发送的,通过它来对每一个请求结果进行判断比较麻烦,大家可以自行改用axios
,在axios
的响应拦截器中对返回结果做统一的判断。
向首页(index.ejs
)添加一个退出登录的按钮:
1 |
|
为按钮添加点击事件:
1 2 3 4 5 6 7 8 9 10 |
|
这里调用了GET /api/logout
接口,现在定义一下这个接口,在controllers/UserController.js
中定义接口的控制层(C层):
1 2 3 4 5 6 7 8 9 10 |
|
在routes/users.js
中定义Api
路由:
1 2 |
|
前面我们通过 req.session.user = data;
设置的session默认是存放到内存中的,当后端服务重启时这些session
就会被清空,为了解决这一问题我们可以将session
存放到数据库中。
安装connect-mongo
:
1 |
|
connect-mongo是MongoDB会话存储,用于用
Typescript编写的连接
和Express
。
修改app.js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
至此,我们就实现了运用Cookie&Session
进行登录验证/权限拦截的功能!
更多node相关知识,请访问:nodejs 教程!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!