最近,我正在学习中间件" express-session"快递,我想了解给定选项中的所有属性。但是当我读到express-session
的API时,我与三个混淆了
属性:saveUninitialized
,resave
和rolling
。
它们都会对Cookie设置或会话操作产生影响,那么它们的区别和联系是什么?
希望有人能帮助我区分它们,
非常感谢!
答案 0 :(得分:8)
当现代浏览器发出请求时,它会在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
个选项,全部解释为here)我正在简化,但默认情况下,express-session
只在您第一次访问网站时发送Set-Cookie
。
如果rolling
为true
,则每次都会发送maxAge
。这具有期望的副作用,即在每次页面刷新时连续地向前滚动cookie的到期。新的到期日期是通过将req.session
添加到当前服务器时间来确定的。
如果您更改resave
对象,它将在请求结束时保存回会话存储区;否则将无法保存。将true
设置为req.session.user = user;
会强制每次都保存它,即使没有进行任何更改也是如此。这可能看似不合逻辑,但某些商店可能需要这样做(虽然看了清单,似乎目前没有商店)。
首次设置cookie时,会在内存中创建一个新的会话对象,并在请求结束时保存到存储中。如果您有许多人访问然后在没有执行任何有意义的操作(如登录)的情况下进行弹跳,则这会占用数据库中的大量空间。您可以选择仅在会话偏离默认会话对象时保存会话(即,如果您'通过将saveUninitialized
设置为false
来修改它,例如在登录时设置{{1}}。
需要注意的是,这些值(以及其他值)的某些组合可能会产生意外行为。例如,文档说明:
当此选项[rolling]设置为true但saveUninitialized选项设置为false时,将不会对未初始化会话的响应设置cookie。