express-session
的API时,我对三个属性感到困惑:saveUninitialized
、resave
和rolling
。它们都对cookie设置或会话操作产生影响,那么它们之间有什么区别和联系呢?希望有人可以帮我区分它们,非常感谢!express-session
的API时,我对三个属性感到困惑:saveUninitialized
、resave
和rolling
。它们都对cookie设置或会话操作产生影响,那么它们之间有什么区别和联系呢?希望有人可以帮我区分它们,非常感谢!当现代浏览器发出请求时,它会将所有与当前域名(网站)匹配的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
(它还可以附加path
、secure
和HttpOnly
选项,所有这些都在这里解释)我简化了一下,但默认情况下,express-session
仅在您首次访问网站时发送Set-Cookie
。
如果rolling
为true
,它将每次都被发送。这具有每次页面刷新都向前滚动cookie过期时间的预期副作用。新的过期日期是通过将maxAge
添加到当前服务器时间来确定的。
如果您更改req.session
对象,它将在请求结束时保存回会话存储中;否则它将不会被保存。将resave
设置为true
会强制每次都保存,即使没有进行任何更改。这可能看起来不合逻辑,但某些存储可能需要这样做(尽管在查看列表后,似乎目前没有需要这样做的存储)。
第一次设置cookie时,会在内存中创建一个新的session对象,并在请求结束时保存到存储中。如果您有很多人访问网站但未执行任何有意义的操作(如登录),只是简单地跳转,那么这可能会占用大量数据库空间。您可以通过将saveUninitialized
设置为false
来选择仅在会话对象与默认会话对象不同时才保存会话(即如果您已修改它,例如在登录时设置req.session.user = user;
)。
要注意的是,某些值的组合(以及其他值)可能会产生意外行为。例如,文档指出:
当设置此选项[rolling]为true但将
saveUninitialized
选项设置为false时,在具有未初始化会话的响应上不会设置cookie。