在express-session中,“saveUninitialized”、“resave”和“rolling”属性的确切含义是什么?

7
最近,我正在学习express的中间件“express-session”,我想了解给定选项中的所有属性。但是当我阅读express-session的API时,我对三个属性感到困惑:saveUninitializedresaverolling。它们都对cookie设置或会话操作产生影响,那么它们之间有什么区别和联系呢?希望有人可以帮我区分它们,非常感谢!

https://dev59.com/g1kS5IYBdhLWcg3wFi-k - Sunil Garg
https://dev59.com/NF0Z5IYBdhLWcg3wfge- - Sunil Garg
2
你应该接受这个答案,它真的很好。 - Alfonso
1个回答

17

当现代浏览器发出请求时,它会将所有与当前域名(网站)匹配的cookie附加在Cookie头中。以下是我访问stackoverflow.com时,我的浏览器可能发送的示例:

Cookie: acct=1234

第一次访问网站时,浏览器不会发送任何cookie。在这种情况下(如果所有者想要利用cookie跟踪用户会话),服务器通常会响应一个Set-Cookie头,类似于这样:

Set-Cookie: acct=5678; expires=Sat, 15 May 2050 15:32:57 GMT; domain=.stackoverflow.com

(它还可以附加pathsecureHttpOnly选项,所有这些都在这里解释)我简化了一下,但默认情况下,express-session仅在您首次访问网站时发送Set-Cookie

如果rollingtrue,它将每次都被发送。这具有每次页面刷新都向前滚动cookie过期时间的预期副作用。新的过期日期是通过将maxAge添加到当前服务器时间来确定的。

如果您更改req.session对象,它将在请求结束时保存回会话存储中;否则它将不会被保存。将resave设置为true会强制每次都保存,即使没有进行任何更改。这可能看起来不合逻辑,但某些存储可能需要这样做(尽管在查看列表后,似乎目前没有需要这样做的存储)。

第一次设置cookie时,会在内存中创建一个新的session对象,并在请求结束时保存到存储中。如果您有很多人访问网站但未执行任何有意义的操作(如登录),只是简单地跳转,那么这可能会占用大量数据库空间。您可以通过将saveUninitialized设置为false来选择仅在会话对象与默认会话对象不同时才保存会话(即如果您已修改它,例如在登录时设置req.session.user = user;)。

要注意的是,某些值的组合(以及其他值)可能会产生意外行为。例如,文档指出:

当设置此选项[rolling]为true但将saveUninitialized选项设置为false时,在具有未初始化会话的响应上不会设置cookie。


我们可以聊一下吗?我有几个疑问。 - Suraj Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接