什么是session?

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

为什么需要session?

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

所以为了解决问题,人们想出了很多方法,比如说登录后在数据库中对该用户的数据打上登录的标记,每次链接网页就去查询谁登录了,但是这种办法太笨,会造成对服务器的压力。

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

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

Session的机制

1.生成全局唯一标识符(sessionid);每个客户端对应一个id,服务器识别客户端后通过其id读取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('/');
})

利用express-session插件实现nodejs中登录状态的保存的更多相关文章

  1. PHP如何将session保存到memcached中?如何分布式保存PHP session

    session_set_save_handler无关的memcached保存session的方法 在memcached服务器上 1)下载memcached #wget http://memcached ...

  2. 【React】377- 实现 React 中的状态自动保存

    点击上方"前端自习课"关注,学习起来~ 作者:陈俊宇 https://github.com/CJY0208 什么是状态保存? 假设有下述场景: 移动端中,用户访问了一个列表页,上拉 ...

  3. Android开发中Activity状态的保存与恢复

    当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...

  4. vue-router + axios token登录状态认证

    vue项目中登录状态判断往往基于jwt认证,我们可以采用判断本地是否存在token,及token是否过期或token值错误 1.利用vue-router 钩子函数判断本地是否存在token impor ...

  5. 使用robotframework做接口测试三——保持登录状态

    调用登录接口登录了,其他的接口怎么保持登录状态呢?  首先来看一看,web端或者说客户端是怎么样用cookie/token等保持登录状态的.一般来说,cookie都会在登录接口由服务端返回,而且会是在 ...

  6. Express + Session 实现登录验证

    1. 写在前面 当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态.这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我 ...

  7. express session 实现登录

    https://www.cnblogs.com/mingjiatang/p/7495321.html Express + Session 实现登录验证   1. 写在前面 当我们登录了一个网站,在没有 ...

  8. nodejs:注册登录session出错以及连接Mongodb数据库时Error connecting to database解决方案

    (1)nodejs:注册登录session出错 解决办法: 在app.js 中将var MongoStore =  require(connect-mongo')改为var MongoStore =  ...

  9. nodejs中cookie、session的使用

    因为http会话的无状态性,为了标记用户的登录状态,便出现了cookie.cookie分为很多种,有普通cookie.签名cookie.json cookie等,这里主要记录下在express应用中如 ...

随机推荐

  1. UE4的联网系统研究

    1. 物体复制 具体细节可参考官网内容:http://api.unrealengine.com/CHN/Gameplay/Networking/index.html 这里只挑部分点来展开. 首先,分为 ...

  2. js中实现函数防抖跟函数节流

    最近刚接触两个新概念函数防抖与函数节流,虽然这些内容网上可以搜到很多,大家都有自己的一套的理解方式,都写得很好, 而自己则想在理解的基础上自己把代码实现一遍,加深印象. 一.函数防抖 假如我们有这样的 ...

  3. 第08组 Alpha冲刺(3/6)

    队名:955 组长博客:https://www.cnblogs.com/cclong/p/11872693.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...

  4. C/C++的内存对齐

    1.内存对齐之pragma pack语法 语法:#pragma pack( [show] | [push | pop] [, identifier], n )作用:指定结构,联合和类的包对齐方式(pa ...

  5. ssh免密钥登陆的两种方式

    ssh 免密钥登陆的两种方式第一种:直接使用命令复制过去ssh-copy-id root@192.168.3.113批量复制for i in {113..140}; do ssh-copy-id ro ...

  6. Python10大热门项目

    文章地址:https://baijiahao.baidu.com/s?id=1625230403885659615&wfr=spider&for=pc 今天给大家盘点一下实验楼最热门的 ...

  7. 【MySQL】Mysql模糊查询like提速优化

    一般情况下like模糊查询的写法为(field已建立索引): SELECT `column` FROM `table` WHERE `field` like '%keyword%'; 上面的语句用ex ...

  8. Qt 一张图片显示在其他组件之上

    图片放在QLabel上,注意设置QLable一些属性 QImage img("test.png"); img = img.scaledToWidth(,Qt::SmoothTran ...

  9. 经典面试题之——如何自由转换两个没有继承关系的字段及类型相同的实体模型,AutoMapper?

    相信很多童鞋们都被问到过这个问题,不管是在面试的时候被问过,还是笔试题里考过,甚至有些童鞋们找我要学习资料的时候我也考过这个问题,包括博主我自己,也曾被问过,而且博主现在有时作为公司的面试官,也喜欢问 ...

  10. Python - Django - 扩展默认 auth 表

    models.py: from django.db import models from django.contrib.auth.models import AbstractUser class Us ...