Node.js中Session的基本原理与身份验证实现

作者:终端旅客

时间:2026-10-29

浏览:338

本文介绍Node.js中Session的工作原理,阐述其基于Cookie实现用户身份识别的机制。通过Express框架示例,详细演示如何配置session中间件、解析Cookie并存储用户信息,进而实现简单的登录验证与权限控制流程。

文章目录

Session原理与Cookie机制

Session机制无需过多赘述,其核心作用是将单一的HTTP请求与特定的终端用户建立关联,从而维持状态。

Session的实现本质依赖于Cookie技术。

其基本流程为:服务端预先在HTTP响应中设置Cookie,当客户端再次发起请求时携带该Cookie标识。服务端接收到此标识后,会在指定的存储位置(如数据库或文件系统)中检索对应的用户身份信息,并将该身份赋值给当前的Request对象,使得后续程序处理能够获知用户身份。这一过程在PHP、ASP等传统服务端语言中通常由系统自动完成。

Cookie生成与服务端处理

实现Cookie生成逻辑

系统需为每个用户生成一个能够唯一标识其身份的Cookie值,可参考以下生成规则。

例如,将注册邮箱的MD5值、密码的MD5值以及随机码的MD5值进行组合拼接(注:此仅为示例方案,实际应用中可能并非最佳实践)。

服务端相关代码片段如下:


res.setHeader("Set-Cookie", ["sid="+newUser.toCookie()+";path=/;domain="+config.domain+";expires="+new Date("2030") ]); 

Cookie处理


sid=275fccab7935736ff68c95c3ddbfaaee|275fccab7935736ff68c95c3ddbfaaee|275fccab7935736ff68c95c3ddbfaaee 

通过读取Cookie获取用户身份,并据此设置Session。

将所有非静态资源的请求统一路由至该处理函数。在此处解析Cookie,将其拆分后在数据库中查找匹配的用户记录,最后调用next()函数将请求传递给后续的中间件或路由逻辑。

在后续的处理逻辑中,即可直接通过req.session.user属性获取到user对象。


session:function(req, res, next){
req.session = {};
if( req.cookies && req.cookies.sid ){
var a = req.cookies.sid.split("|");
var hexMail = a[0];
var hexPwd = a[1];
var hexRandom = a[2];
UserModel.hexFind(hexMail, hexPwd, hexRandom, function( status ){
//console.log("hexFind", status );
if(status.code == "0"){
//req.cookiesSelecter = cookiesSelecter;
req.session.user = status.result;
}
next();
});
}else{
next();
} 
}

Express Session身份验证实现

接下来介绍如何在Node.js中利用Session机制实现身份验证。

基于Node.js Express框架的Session身份验证配置

第一步:引入必要的模块


var session = require('express-session');
var cookieParser = require('cookie-parser');

第二步:配置并应用Cookie及Session中间件


app.use(cookieParser());
app.use(session({
resave: true, // don't save session if unmodified
saveUninitialized: false, // don't create session until something stored
secret: 'love'
}));

第三步:在请求处理中应用身份验证逻辑


app.use(function(req,res,next){
if (!req.session.user) {
if(req.url=="/login"){
next();//如果请求的地址是登录则通过,进行下一个请求
}
else
{
res.redirect('/login');
}
} else if (req.session.user) {
next();
}
});

第四步:设计登录相关接口


app.get('/login',function(req,res){
res.render("login");
});
app.post('/login',function(req,res){
if(req.body.username=="love" && req.body.password=="love"){
var user = {'username':'love'};
req.session.user = user;
res.redirect('/admin/app/list');
}
else
{
res.redirect('/login');
}
});
app.get('/logout',function(req,res){
req.session.user = null;
res.redirect('/login');
});

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章