express-session中的saveUninitialized和resave
2024-09-07 09:21:46
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_
最新文章
- Nginx负载均衡和LVS负载均衡的比较分析
- hdu 2053 Switch Game 水题一枚,鉴定完毕
- 【NOIP2015】提高组D1 解题报告
- EditPlus3.3 集成 SVN
- SVM(支持向量机)(二)—Lagrange Duality(拉格朗日对偶问题)
- UVa 900 - Brick Wall Patterns
- CGLib方式对接口实现代理
- QWebEngineView拦截Url请求设置
- 解决打开MATLAB时出现“Waring:could not read file classpath.txt”,等问题
- Vijos P1784 数字统计【模拟】
- 20165314 [第二届构建之法论坛] 预培训心得(Java版)
- spring mvc controller中的参数验证机制(二)
- Mybatis 查询tinyint(1)的数据库字段时会自动转换成boolean类型
- batch normalization在测试时的问题
- 开机或者安装系统时提示tsc: Fast TSC calibration failed解决方法
- 函数名、闭包、装饰器 day11
- powerdesigner 不显示表字段只显示表名
- 常用python包(依赖)Ubuntu下
- 20155230 2016-2017-2 《Java程序设计》第七周学习总结
- oozie与mapreduce简单案例
热门文章
- PHP mysqli_thread_id() 函数
- 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP
- 面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
- Nginx实现静态服务器+https+负载均衡
- Java不可不知的泛型使用
- MixNet:MixConv:Mixed Depthwise Convolution kernels
- SCHP代码中的问题
- html定时跳转页面
- C# ASP 分析器错误信息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
- springboot中使用定时器