Redis
是一个非常适合用于Session
管理的数据库。第一,它的结构简单,key-value
的形式非常符合SessionID-UserID
的存储;第二,读写速度非常快;第三,自身支持数据自动过期和清除;第四,语法、部署非常简单。基于以上原因,很多Session
管理都是基于Redis
实现的。
Express
已经将Session
管理的整个实现过程简化到仅仅几行代码的配置的地步了,你完全不用理解整个session
产生、存储、返回、过期、再颁发的结构,使用Express
和Redis
实现Session
管理,只要两个中间件就足够了:
npm install express-session --save
npm install connect-redis --save
文档地址:
express-session
connect-redis
var express = require('express');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var app = express();
var options = {
"host": "127.0.0.1",
"port": "6379",
"ttl": 60 * 60 * 24 * 30, //Session的有效期为30天
};
// 此时req对象还没有session这个属性
app.use(session({
store: new RedisStore(options),
secret: 'express is powerful'
}));
// 经过中间件处理后,可以通过req.session访问session object。比如如果你在session中保存了session.userId就可以根据userId查找用户的信息了。
上述代码只是对于请求的Session
静态处理,整个用户管理的另一个方面则是状态的切换(用户的登陆、登出)以及用户数据的获取。
login:
//查找用户信息,看是否满足登陆条件
var user = findUser(username, password);
if(user){
//成功获取用户对象
req.session.regenerate(function(){
req.user = user;
req.session.userId = user.id;
req.session.save(); //保存一下修改后的Session
res.redirect('/index');
});
}
else{
//用户信息不符合,登陆失败
}
logout:
//查找用户信息,看是否满足登陆条件
req.clearCookie('connect.sid');
req.user = null;
req.session.regenerate(function(){
//重新生成session之后后续的处理
res.redirect('/login');
})
check:
if(req.session.userId){
next();
}else{
res.redirect('/login');
}