app.use(session({
name: config.session.name,
secret: config.session.secret,
resave: true,
saveUninitialized: false,
cookie: config.session.cookie,
store: new MongoStore({
url: config.url
})
}))

express-session是一个中间件,接收一写参数,返回一个函数:

return function session(req, res, next) {}

首先当请求到达服务端的时候,解析request,拿到cookie中的sessionId,保存到req上供后面使用

var cookieId = req.sessionID = getcookie(req, name, secrets);

如果请求的cookie中没有sessionID,会由一个generate方法创建一个session对象,同时在request对象上添加了sessionID,session

store.generate = function (req) {
req.sessionID = generateId(req);
req.session = new Session(req);
req.session.cookie = new Cookie(cookieOptions); if (cookieOptions.secure === 'auto') {
req.session.cookie.secure = issecure(req, trustProxy);
}
};

只要修改了session比如req.session.view++,express-session通过重写了response.end,在返回数据的时候进行一次保存:

var _end = res.end;
res.end = function end(chunk, encoding) {
....
return _end.call(res, chunk, encoding);
}

那么如果没有修改session,是否保存到数据库或者内存中,由函数shouldSave来处理:

function shouldSave(req) {
// cannot set cookie without a session ID
if (typeof req.sessionID !== 'string') {
debug('session ignored because of bogus req.sessionID %o', req.sessionID);
return false;
} return !saveUninitializedSession && cookieId !== req.sessionID
? isModified(req.session)
: !isSaved(req.session)
}
function isSaved(sess) {
return originalId === sess.id && savedHash === hash(sess);
}
function isModified(sess) {
return originalId !== sess.id || originalHash !== hash(sess);
}

其中涉及到saveUninitialized和resave的配置,

saveUninitialized : 是否强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。

resave:是指每次请求都重新设置session cookie,最直观的表现就是客户端的cookie的有效期在变化;

下面是整理的不同配置下在是否有sessionId的cookie的情况下的处理结果表格:

saveUninitialized resave 是否向服务端传递了sessionId的cookie 对应的处理
true true/false 1.由isSaved来决定结果,而此时 isSaved为false shouldSave为true
2.执行保存session的操作
true true/false 1.由isSaved来决定结果,而此时isSaved为true, shouldSave为false
2.不执行保存session的操作
false true/false 1.cookieId为undefined 和req.sessionID不相等
2.由isModified来决定结果,而此时isModified为false shouldSave为false
3.这种情况说的就是如果session未初始化不存储起来,可以减轻服务端的压力
false false 1.cookieId 与 req.sessionID一致
2.有isSaved来决定,此时isSaved()为true,shouldSave为false
3.不执行保存session的操作
false true 1.cookieId 与 req.sessionID一致
2.有isSaved来决定,此时isSaved()为false,shouldSave为true
3.执行保存session的操作

demo地址:

https://github.com/blank-x/node-daily/tree/master/express-session_

express-session中的saveUninitialized和resave的更多相关文章

  1. [转] Express 4 中的变化

    http://www.cnblogs.com/haogj/p/3985438.html 概览 从 Express 3 到Express 4 是一个巨大的变化,这意味着现存的 Express 3 应用在 ...

  2. Express + Session 实现登录验证

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

  3. express session 和 socketio session关联

    express session http是没有状态的协议, 需要web框架自己实现会话和会话管理工作. express框架有session插件可以使用. 见如下介绍: https://www.tuto ...

  4. express session

    一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...

  5. express --- session详解

    之前一直做前端相关的工作,所以不太清楚session,也没有主动了解,最近在学node,对session的认识又有所加深,故总结之. 注: 关于session的一些配置问题,可以看这里. 第一部分: ...

  6. Express session的使用

    进行session存储时需引用中间件,app.js var express=require('express'); var app=express(); var cookieParser = requ ...

  7. NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)

    个人总结: 这篇文章讲解了express框架中如何使用session,主要用了express-session这个包.更多可以参考npm.js来看,读完这篇文章需要10分钟. 摘选自网络: 文档概览 本 ...

  8. express session 实现登录

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

  9. node express session

    在express4.0版本以上,需要单独增加session模块:express-session:https://www.npmjs.com/package/express-session 具体做法是, ...

随机推荐

  1. PHP tmpfile() 函数

    定义和用法 tmpfile() 函数以读写(w+)模式创建一个具有唯一文件名的临时文件. 语法 tmpfile() 提示和注释 注释:临时文件会在文件关闭后(用 fclose())或当脚本结束后自动被 ...

  2. 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治

    LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...

  3. 【好文推荐】黑莓OS手册是如何详细阐述底层的进程和线程模型的?

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  4. JDK下载和安装教程,超详细

    下载并安装JDK JDK的全称是JavaSE Development Kit,即java开发工具包,是sun公司提供的一套用于开发java应用程序的开发包,它提供了编译.运行java程序所需的各种工具 ...

  5. JS pc端网页特效

    offset     offset翻译就是偏移量,可以使用他相关的属性可以动态的得到该元素的位置.大小等等     获得元素距离带有定位父元素的位置     获得元素自己的大小(宽度高度)     注 ...

  6. Java并发--基础知识

    一.为什么要用到并发 充分利用多核CPU的计算能力 方便进行业务拆分,提升应用性能 二.并发编程有哪些缺点 频繁的上下文切换 时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换 ...

  7. Codechef May Challenge 2020 Division 1 记录

    目录 Triple Sort Sorting Vases Buying a New String Chef and Bitwise Product Binary Land Not a Real Wor ...

  8. DAPP开发初探——永存的留言

    转载地址 https://blog.csdn.net/qq_33764491/article/details/80570266 前言 最近DAPP的开发貌似很火,学习了区块链的一些知识之后,相信有很多 ...

  9. ElementUi——el-select下拉框

    <el-select v-model="ruleForm.status" placeholder="请选择状态" @change="styleC ...

  10. 记好这 24 个 ES6 方法,用来解决实际开发的 JS 问题

    本文主要介绍 24 中 es6 方法,这些方法都挺实用的,本本请记好,时不时翻出来看看. 1.如何隐藏所有指定的元素 const hide = (el) => Array.from(el).fo ...