什么是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. fluent在运行时改变重力方向方法总结

    Fluent版本:19.0(其他版本应该也适用) 这里我们用一个简单的算例(同心环中的自然对流)来说明 算例来自<ANSYS Fluid Dynamics Verification Manual ...

  2. MySQL百万级数据分页查询及优化

    方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺 ...

  3. hg19基因组 | 功能区域 | 位置提取

    如何获取hg19的CDS.UTR.intergenic.intron等的位置信息? 参考手册: Hg19 regions for Intergenic, Promoters, Enhancer, Ex ...

  4. python lambda表达式简单用法【转】

    python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...

  5. MySQL:实现cumsum(累加)的功能

    需求:为实现cumsum累计求和的功能. 一张视图. SELECT 日期, 净利润 FROM daily_pnl_view; 现在希望得到,每天累计的利润是多少. SET @csum := 0;SEL ...

  6. kotlin基础 常见容器的取值范围

  7. java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  8. js代码突然在花括号回车自动多加了一个大括号

    js代码突然在花括号回车自动多加了一个大括号. 检查发现,前面有一个行带有左括号的注释行.

  9. Mac mysql 忘记root密码的解决方法

    1.执行命令以安全模式启动MySQL cd /usr/local/mysql/bin sudo ./mysqld_safe --skip-grant-tables 2.同上面目录下执行 '\) whe ...

  10. EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(一)使用Onvif协议进行设备发现以及指定设备信息探测

    背景分析 众所周知,EasyNVR不拘泥.不受限于摄像机的品牌厂商及其配套平台,只要是网络监控摄像机IPC.硬盘录像机NVR.且设备支持标准的RTSP/Onvif协议,都可以接入实时视频流进入Easy ...