express-session中的saveUninitialized和resave
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的更多相关文章
- [转] Express 4 中的变化
http://www.cnblogs.com/haogj/p/3985438.html 概览 从 Express 3 到Express 4 是一个巨大的变化,这意味着现存的 Express 3 应用在 ...
- Express + Session 实现登录验证
1. 写在前面 当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态.这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我 ...
- express session 和 socketio session关联
express session http是没有状态的协议, 需要web框架自己实现会话和会话管理工作. express框架有session插件可以使用. 见如下介绍: https://www.tuto ...
- express session
一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...
- express --- session详解
之前一直做前端相关的工作,所以不太清楚session,也没有主动了解,最近在学node,对session的认识又有所加深,故总结之. 注: 关于session的一些配置问题,可以看这里. 第一部分: ...
- Express session的使用
进行session存储时需引用中间件,app.js var express=require('express'); var app=express(); var cookieParser = requ ...
- NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)
个人总结: 这篇文章讲解了express框架中如何使用session,主要用了express-session这个包.更多可以参考npm.js来看,读完这篇文章需要10分钟. 摘选自网络: 文档概览 本 ...
- express session 实现登录
https://www.cnblogs.com/mingjiatang/p/7495321.html Express + Session 实现登录验证 1. 写在前面 当我们登录了一个网站,在没有 ...
- node express session
在express4.0版本以上,需要单独增加session模块:express-session:https://www.npmjs.com/package/express-session 具体做法是, ...
随机推荐
- luogu P3830 [SHOI2012]随机树 期望 dp
LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...
- loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化
LINK:珠宝 去年在某个oj上写过这道题 当时懵懂无知wa的不省人事 终于发现这个东西原来是有决策单调性的. 可以发现是一个01背包 但是过不了 冷静分析 01背包的复杂度有下界 如果过不了说明必然 ...
- [转]Java死锁排查
文章来源:微信公众号:猿天地 1. 死锁的概念: 是Java多线程情况下,两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都讲无法推进下去.此时称 ...
- JavaWeb项目的部署以及远程调试
Linux环境下软件的安装 Linux环境下的程序的安装.更新.卸载和查看. rpm 命令:相当于windows程序的添加/卸载程序,进程程序的安装,查看,卸载. 本地程序安装:rpm -ivh 程序 ...
- 解决IIS发布时CS0016未能写入输出文件错误
今天遇到一个将asp.net项目部署到IIS后访问的时候报的一个错误: 在网上查询了相关资料后,解决方法如下: 找到C:\Windows\下的temp文件,右键属性>安全>编辑,给其中II ...
- 全球疫情爬取APP版
全球疫情统计APP图表展示: 将该任务分解成三部分来逐个实现: ①爬取全球的疫情数据存储到云服务器的MySQL上 ②在web项目里添加一个servlet,通过参数的传递得到对应的json数据 ③设计A ...
- IDEA的基本使用技巧
博主在大学里学习的专业是计算机科学与技术,在大三的时候才开始接触 “加瓦”,学习加瓦首先就需要一个运行环境,因为受到了老师们的影响,我第一个编辑JAVA的软件环境便是Eclipse,在学校里学习和使用 ...
- 拓展欧几里得求 ax + by = c的通解(a >=0, b >= 0)
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> ...
- 2020-07-13:es是去查id再根据id去查数据库这种方式好,还是所有数据都放es,直接去查es好?
福哥答案2020-07-13: 有人觉得第一种方法好,也有人觉得第二种方法好.如果搜索字段远小于显示字段,比如搜索字段为3个,显示字段有20个,这个时候用第一种方法好.es+hbase,一般这样搭配. ...
- 利用BeautifulSoup去除HTML指定标签和去除注释
去除指定标签 from bs4 import BeautifulSoup #去除属性ul [s.extract() for s in soup("ul")] # 去除属性svg [ ...