最近在座的这个项目中遇到需要保存用户状态的情况,在这里总结一下,向大家虚心学习,如有错误,请帮助我指正
我之前总结的有关session的相关知识,如果有兴趣可以看一下session机制
在开发环境中,session的值一般存储在服务器内存中,当服务器进程停止或者服务器重启时,用户存储用户信息的session值就消失了,这样当我们再次登录页面的时候,我们还需要再次填写用户名和密码,这样的额用户体验很差,我们需要将用户的状态持久化存储下来,有如下四种方法:
1.cookie:将session信息存储入cookie中,通过cookie解析得到
2.基于内存存储:使用内存当容器,来存储session的数据
3.redis(将数据存储进入Redis数据库,不同进程都可以获得这个数据,cookie解析获得sessionid,通过sessionid来获取数据库中的数据)
4.mongodb(原理和3相同)
项目中我用的是express框架,以mongodb作为后台存储的数据库,所以主要说一下第四种方案。
1.首先,session的实现需要依赖cookie,我们需要安装解析cookie的中间件,cookie-parser
npm install --save cookie-parser
2.安装express-session提供会话支持(在express 4.0之前的版本,像session之类的中间件是伴随express自动安装的,网上有的教程使用的express版本正是4.0之前的版本,但是如果我们安装的是4.0之后版本的express,就需要独立安装express-session中间件了
使用npm list可以查看所有你安装的模块的版本)
npm install --save express-session
我们可以在session中配置相关参数
例如设置secret防止cookie被篡改,生存周期之类
3.我们需要安装connect-mongo这个模块与数据库建立新的连接
npm install --save connect-mongo
设置store参数,为一个mongodb的实例,就可以将会话信息存储到数据库中,避免丢失
具体过程简述如下:
首先我们从cookie中读取加密的connectid,再通过cookie-parser解析为对应的sessionid,这个sessionid被保存在req.sessionid中,所以cookie-parser这个中间件要放在session前面,在读取session内容的额时候我们需要通过store对象来读取数据库中的数据,所以当多个请求并发的时候,拿到的是同一个session数据,每个协议在调用res.end()的时候都会自动将sessionid再次存储一次
代码如下:
var cookieParser = require('cookie-parser');
var session = require('express-session');
var mongoStore = require('connect-mongo')(session);
var dburl = 'mongodb://localhost/newproject';
app.use(cookieParser());
//通过Mongostore这个中间件将session数据存储进入数据库
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
store:new mongoStore({
url: dburl,
collection: 'session'
})
}))
app.post("/user/signin",function (req,res) {
var _user = req.body;
var name = _user.name;
var password = _user.password;
User.find({name:name},function (err,user) {
if(err){
console.log(err);
return;
}
if(user.length == 0){
//没有改用户
res.json({result: 1});
return;
}
user[0].comparePassword(password,function (err,isMatch) {
if(err){
console.log(err);
return;
}
if(isMatch){
//将用户信息存储到数据库的session文档中去
req.session.user = user[0];
res.json({result:3});
return;
}
res.json({result:2});
})
})
})