热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:koasession源码学习——session处理流程

本文由编程笔记#小编为大家整理,主要介绍了koa-session源码学习——session处理流程相关的知识,希望对你有一定的参考价值。上一篇文章中,我们以ctx.session.vie
本文由编程笔记#小编为大家整理,主要介绍了koa-session源码学习——session处理流程相关的知识,希望对你有一定的参考价值。

上一篇文章中,我们以ctx.session.views=2 这一行代码为线索,探讨了示例代码以及koa-session源码的整体执行流程,sess.session为追踪重点,今天我们进一步完善源码中关于session的处理流程。

我们接着上篇的内容向下进行,上一篇中的this.session打印如下:

Session {_sessCtx: ContextSession, _ctx: Object, isNew: true, views: 2}

 

我们从Index.js的 commit()方法说起:

return async function session(ctx, next) {
const sess
= ctx[CONTEXT_SESSION];
if (sess.store) await sess.initFromExternal();
try {
await next();
}
catch (err) {
throw err;
}
finally {
if (opts.autoCommit) {
await sess.commit();
}
}
};

sess.commit()调用的是 ContextSession 里的commit方法,首先来看该方法的开头部分:

const session = this.session;
const opts
= this.opts;
const ctx
= this.ctx;

我们将这里的session打印出来,结果如下:

Session {_sessCtx: ContextSession, _ctx: Object, isNew: true, views: 2}

发现到这里还没有加密,我们继续向下看,_shouldSaveSession()方法里的:

const json = session.toJSON();

此时打印出json:

Object {views: 2}

可以看到上面的session只剩下了views属性,来看看.JSON()方法的代码:

toJSON() {
const obj
= {};
Object.keys(
this).forEach(key => {
if (key === ‘isNew‘) return;
if (key[0] === ‘_‘) return; //key[0]代表key的第一位
obj[key] = this[key];
});
return obj;
}

可以理解,是将session里的 isNew属性 和 以‘_’开头的属性都去掉了。

 

继续看_shouldSaveSession()方法里的:

const changed = prevHash !== util.hash(json);
if (changed) return ‘changed‘;

prevHash为create()方法里生成的,假设我们是第一次执行ctx.session.views=2,ctx.COOKIEs.get 为空,因此这里的 prevHash为undefined,我们再将util.hash(json),打印出来,查看一下:

552152158

你会发现原来的json,由Object {views: 2}变为了552152158。 因此这段代码返回的是 ‘changed’

 

我们来看util.hash()方法:

hash(sess) {
return crc(JSON.stringify(sess));
},

很简单的代码!用的crc插件进行处理,其中JSON.stringify(sess)的作用是,将json从 Object {views: 2} 变为:{"views":2},由object格式变为了JSON格式。

 

最后到save()方法,先将待保存的session对象,添加了_expire属性和_maxAge属性:

// set expire for check
json._expire = maxAge + Date.now();
json._maxAge
= maxAge;

我们再将json打印出来:

Object {views: 2, _expire: 1592550308718, _maxAge: 86400000}

 

然后对整个json也就是session进行base64编码加密:

json = opts.encode(json);

加密后的json再次打印出来为:

eyJ2aWV3cyI6MiwiX2V4cGlyZSI6MTU5MjU1MDM3MjI0MiwiX21heEFnZSI6ODY0MDAwMDB9

 

此时在因特网上传输起来,已经具有了一定得保密性。

 

base64编码方法如下:

encode(body) {
body
= JSON.stringify(body);
return Buffer.from(body).toString(‘base64‘); //base64编码实际是对二进制数进行编码,Buffer.from()为Node.js处理二进制数据时使用。
}

 

对应的base64解码方法:

decode(string) {
let json
= Buffer.from(string,‘base64‘).toString(‘utf-8‘);
json
= JSON.parse(json);
return json;
}

 

最后将base64编码的json,保存到COOKIE中:

this.ctx.COOKIEs.set(key, json, opts);

 

由此我们可以看到,session实际上是以COOKIE 的形式保存的。

 

如果文章中有不正确的地方,欢迎大家交流指正。

 


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
momosu1028_738_636
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有