什么是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. ConcurrentHashMap 无锁读

    ConcurrentHashMap 可以做到无锁读,而写使用分段锁机制,把整个哈希表切分成段segment(默认为16段),每段有一个锁,最多可以同时有16个写线程.而读不受限制. 下文转自http: ...

  2. Java手机号隐藏中间4位和邮箱隐藏,身份证隐藏

    1.Java代码中隐藏 //隐藏手机号码中间四位 String phoneNumber = "15567893456"; String resultPhone= phoneNumb ...

  3. windows获取管理员权限 操作文件

    1.文件右键属性 2.安全tab 一路 “应用”和“确定”

  4. 解决启动redis出现的creating server tcp listening socket *:6379: listen: unknown error

    今天运行redis服务端时候出现这个问题: D:\php\software\redis>redis-server.exe [] Dec ::00.797 # Warning: no config ...

  5. DateUtils.formate()函数的“bug”

    写在前面 项目功能测试, 日期格式转换出现个诡异的问题, 转换后的时间总是和系统当前时间相差8小时, 问题是另一个项目和这个代码完全一样, DateUtils.java, 包括formatDate() ...

  6. vue 专题 vue2.0各大前端移动端ui框架组件展示

    Vue 专题 一个数据驱动的组件,为现代化的 Web 界面而生.具有可扩展的数据绑定机制,原生对象即模型,简洁明了的 API 组件化 UI 构建 多个轻量库搭配使用 请访问链接: https://ww ...

  7. 阿里巴巴Java开发手册(华山版)

    插件下载地址: https://github.com/alibaba/p3c 2018年9月22日,在2018杭州云栖大会上,召开<码出高效:Java 开发手册>新书发布会,并宣布将图书所 ...

  8. WebGL学习笔记(八):光照

    局部光照与全局光照 局部光照 只考虑光源到模型表面的照射效果,运算量较小: 全局光照 考虑到环境中所有表面和光源相互作用的照射效果,即让没有直接受光照射的位置也会受周围反射光的影响,运算量较大: Ph ...

  9. IfcColumn

    IfcColumn is a vertical structural member which often is aligned with a structural grid intersection ...

  10. python 使用 elasticsearch 常用方法(检索)

    #记录es查询等方法 #清楚数据 curl -XDELETE http://xx.xx.xx.xx:9200/test6 #初始化数据 curl -H "Content-Type: appl ...