利用express-session插件实现nodejs中登陆状态的保存

什么是session?javascript

session就是会话,客户端和服务器直接的会话。他的粒度比http连接更粗,一次会话包含了屡次链接。即一个session是屡次http链接的集合。从个人客户端链接到服务器到关闭客户端,这期间的客户端和服务器之间的联系就是一次会话。java

为何须要session?数据库

咱们知道,http是无状态的,每一次http链接之间是无关联的。就好像加入a是客户端,b是服务器,那么无状态就是指a没有记忆力,每一次a和b的对话(即每一次http链接),a都是记不住,a不记得本身以前是否跟b说过话,也不记得说话的内容,这就是http的无状态。http的这个特性就致使了咱们没法直接实现状态登陆的保存,没法实现当登陆帐号后链接该服务器其余页面时依旧保持着登录的状态。express

因此为了解决问题,人们想出了不少方法,好比说登陆后在数据库中对该用户的数据打上登陆的标记,每次连接网页就去查询谁登陆了,可是这种办法太笨,会形成对服务器的压力。json

还有一种办法是利用cookie,cookie就是一种客户端存储技术。咱们能够把用户的信息存储在cookie中,每次切换页面就去cookie中查询,保持该用户的登陆状态。可是这种办法有一个巨大缺陷,就是不够安全,信息是存储在客户端的,有可能被其余用户恶意读取篡改,因此这种办法也不可行。安全

这时候人们就想,既然存储在客户端不安全,那我存在服务器不就相对安全了吗?因此就有了session的诞生。因此总结下来,session就是一种在同一主机不一样http请求之间保持状态的技术手段服务器

Session的机制cookie

1.生成全局惟一标识符(sessionid);每一个客户端对应一个id,服务器识别客户端后经过其id读取session中的数据session

2.开辟数据存储空间。通常会在内存中建立相应的数据结构,但这种状况下,系统一旦掉电,全部的会话数据就会丢失,若是是电子商务网站,这种事故会形成严重的后果。不过也能够写到文件里甚至存储在数据库中,这样虽然会增长I/O开销,但session能够实现某种程度的持久化,并且更有利于session的共享;数据结构

 

下面以Node.js中express框架的express-session插件来具体实现登陆状态的保存(使用的MongoDB数据库)

//当用户点击登陆选项时,以post方式将表单数据传送到服务器
router.post('/login',function(req,res) {
    //获取表单数据 var body = req.body;
    //User是数据库模型 在该数据库中查找是否有对应数据 User.findOne({ email:body.email, password:md5(md5(body.password)) },function(err,data) {
          //服务器错误 if(err) { return res.status(500).json({ err_code:500, message:'server is busy' }); }
          //若是找不到对应数据 说明输入错误 if(!data) { return res.status(200).json({ err_code:1, message:'email or nickname is wrong!' }) }
          //若是找到数据 则将找到的数据存入session的user属性中 // 注意 存放的应该是数据库中该用户的数据 req.session.user = data; res.status(200).json({ err_code:0, message:'ok!' }) }) })

 想要实现登陆状态的保持,则存入的数据必定得是该用户库中存放的数据,方便后面的操做。存入数据后,没法用户访问该主机哪一个页面,数据都会存在,随时均可以调用,也就实现了登陆状态的保持

 

当咱们想退出登陆时,则应该讲解session数据清空,也就等于退出了登陆状态

router.get('/logout',function(req,res) {
	req.session.user = null;
	res.redirect('/');
})
相关文章
相关标签/搜索