session配置项详解(2)

//这个方法用户判断是否需要在请求头中设置cookie // determine if cookie should be set on response function shouldSetCookie(req) { // cannot set cookie without a session ID //如果没有sessionID直接返回,这时候不用设置cookie if (typeof req.sessionID !== 'string') { return false; } //var cookieId = req.sessionID = getcookie(req, name, secrets); return cookieId != req.sessionID ? saveUninitializedSession || isModified(req.session) //rollingSessions = options.rolling || false,其中rolling表示sessionCookie在每一个响应中都应该被发送。也就是说如果用户设置了rolling即使sessionID没有被修改 //也依然会把session的cookie发送到浏览器 : rollingSessions || req.session.cookie.expires != null && isModified(req.session); }

很显然,如果客户端发送的sessionID和服务器的sessionID一致,如果你指定了rolling为true,那么还是会发送这个session的cookie到客户端,但是如果你设置了rolling为false,那么这时候如果同时设置了req.session.cookie.expires,而且这个req.session被修改了这时候还是会把session的cookie发送到客户端!

saveUninitialized:强制没有“初始化”的session保存到storage中,没有初始化的session指的是:刚被创建没有被修改,如果是要实现登陆的session那么最好设置为false(reducing server storage usage, or complying with laws that require permission before setting a cookie) 而且设置为false还有一个好处,当客户端没有session的情况下并行发送多个请求时。默认是true,但是不建议使用默认值。

var saveUninitializedSession = options.saveUninitialized; /如果用户不指定saveUninitializedSession那么提示用户并设置saveUninitializedSession为true if (saveUninitializedSession === undefined) { deprecate('undefined saveUninitialized option; provide saveUninitialized option'); saveUninitializedSession = true; }

我们来看看这个参数用于做什么判断,首先看看shouldSave方法

// determine if session should be saved to store //判断是否需要把session保存到到store中 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; } // var saveUninitializedSession = options.saveUninitialized; // var cookieId = req.sessionID = getcookie(req, name, secrets); return !saveUninitializedSession && cookieId !== req.sessionID ? isModified(req.session) : !isSaved(req.session) }

如果用户指明了不能保存未初始化的session,同时服务器的req.sessionID和浏览器发送过来的不一致,这时候只有在服务器的session修改的时候会保存。如果前面的前提不满足那么就需要看是否已经保存过了,如果没有保存过那么才会保存!

这个参数还被用于决定是否需要把session的cookie发送到客户端:

//这个方法用户判断是否需要在请求头中设置cookie // determine if cookie should be set on response function shouldSetCookie(req) { // cannot set cookie without a session ID //如果没有sessionID直接返回,这时候不用设置cookie if (typeof req.sessionID !== 'string') { return false; } //var cookieId = req.sessionID = getcookie(req, name, secrets); return cookieId != req.sessionID ? saveUninitializedSession || isModified(req.session) //rollingSessions = options.rolling || false,其中rolling表示sessionCookie在每一个响应中都应该被发送。也就是说如果用户设置了rolling即使sessionID没有被修改 //也依然会把session的cookie发送到浏览器 : rollingSessions || req.session.cookie.expires != null && isModified(req.session); }

如果客户端和服务器端的sessionID不一致的前提下,如果用户指定了保存未初始化的session那么就需要发送,否则就只有在修改的时候才发送

secret:用于对sessionID的cookie进行签名,可以是一个string(一个secret)或者数组(多个secret)。如果指定了一个数组那么只会用 第一个元素对sessionID的cookie进行签名,其他的用于验证请求中的签名。

var secret = options.secret; //unsetDestroy表示用户是否指定了unset参数是destroy,是布尔值 if (Array.isArray(secret) && secret.length === 0) { throw new TypeError('secret option array must contain one or more strings'); } //保证secret保存的是一个数组,即使用户传入的仅仅是一个string if (secret && !Array.isArray(secret)) { secret = [secret]; } //必须提供secret参数 if (!secret) { deprecate('req.secret; provide secret option'); }

我们看看这个secret参数用于什么情景:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyxpfp.html