保存用户状态

最近在座的这个项目中遇到需要保存用户状态的情况,在这里总结一下,向大家虚心学习,如有错误,请帮助我指正

我之前总结的有关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});
        })
    })
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值