express-session中的saveUninitialized和resave
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
express-session中的saveUninitialized和resave
e(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的操作
Copy
3.不执⾏保存session的操作
false true是1.cookieId 与 req.sessionID⼀致
2.有isSaved来决定,此时isSaved()为false,shouldSave为true
3.执⾏保存session的操作
saveUninitialized resave是否向服务端传递了sessionId的
cookie对应的处理。