什么是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. 基于centos搭建微信小程序服务,配置及数据库等

    基于centos搭建小程序, ps:请提前20天准备将域名备案,申请ssl证书 实验上机地址:https://cloud.tencent.com/developer/labs/lab/10004 准备 ...

  2. 自建 ca 及使用 ca 颁发证书

    创建CA: 一.安装openssl [root@localhost ~]# yum install -y openssl 二.创建CA的相关文件及目录 mkdir /opt/root_ca & ...

  3. E4A碰到打开自动闪退又自动打开又闪退一直循环的问题

    E4A碰到打开自动闪退又自动打开又闪退一直循环的问题 这几天写了一个脚本,自己手机上,模拟器上,均测试没有问题,可以正常操作 发给另一个人,他那边居然没有一个设备能运行成功! 而且一直闪退,闪退后又打 ...

  4. @Autowired和@Resource的区别和联系

    背景: 今天下班路上看到一个大货车,于是想到了装配,然后脑海里跳出了一个注解@Autowired(自动装配),于是又想到最近工作项目用的都是@Resource注解来进行装配.于是本着学什么东西都要一钻 ...

  5. GPU和显卡是什么关系?GPU会取代CPU吗?

      一.GPU是什么?与显卡是什么关系?安装在什么地方?有单独的GPU板卡吗? GPU就是图像处理芯片,外表与CPU有点相似.显卡的芯片,AMD的一个技术,相当于电脑的处理器CPU,只不过它是显卡的大 ...

  6. CV基础知识点深入理解

    BN实现: Batch Normalization学习笔记及其实现: BatchNormalization 层的实现 使用Python实现Batch normalization和卷积层 Batch N ...

  7. Tocmat 统计tomcat进程内的线程数

    获取tomcat进程pid ps -ef | grep tomcat 统计该tomcat进程内的线程个数 ps -Lf  558899 | wc -l

  8. 如何在本地使用scala或python运行Spark程序

    如何在本地使用scala或python运行Spark程序   包含两个部分: 本地scala语言编写程序,并编译打包成jar,在本地运行. 本地使用python语言编写程序,直接调用spark的接口, ...

  9. (转)plsql11 x64 安装和配置 解决OCI: not initialized

    跟帖子一样,安装了pl/sql ,设置了oci.dll 以及 TNS_ADMIN,加入path后不能显示数据库连接. 安装 microsoft visual c++ redistributable 2 ...

  10. BIO,NIO,AIO到NETTY

    NIO 近期接触了几个产品都触及NIO,要么应用,要么改造项目,听多了也有些了解,但仍然不能真正理解,工期比较赶,还是要潜心下来看看. NIO是什么呢,应该是NOT-BLOCKING IO的意思,不阻 ...