Node + Express会话过期?

21
我有一个基于Express的应用程序和一个登录表单。我需要使会话持续一个月,所以我将maxAge设置为一个月的毫秒数。
我把两台电脑开着并登录了24小时,当我回来时,两台电脑都已注销。
我该如何解决这个问题/实现我想要的功能?谢谢。
5个回答

29

@Vadim Baryshev的被接受的答案在最近的express-session实现中存在问题。当您的应用程序启动时,您创建会话实现并设置最大年龄。至于使用expires的答案,这是不推荐的,请坚持使用maxAge。

这意味着像写出的maxAge示例一样,每个会话都将在服务器启动后一个月过期,并且将立即过期未来创建的每个会话。在服务器重新启动之前,将没有任何有效的会话。

只需将毫秒数传递到maxAge属性,而不是传递日期对象,就像这样:

app.use(
  session({
    ...,
    cookie: {
      maxAge: 30 * 24 * 60 * 60 * 1000
    }
  })
);

16

maxAge表示会话持续的时间,以毫秒为单位; expires表示会话何时过期,即一个日期对象。

var hour = 3600000
req.session.cookie.expires = new Date(Date.now() + hour)
或者
var hour = 3600000
req.session.cookie.maxAge = hour

文档


16
你可以使用 expires 属性代替 maxAge,它的值应该是一个 Date 对象。另外,在客户端设置 session cookie 后,需要检查过期时间。可能会因为服务器重启(比如 memcached)而导致 session 结束。
代码示例:
app.use(express.session(
  { secret: "secret", store: new MemoryStore(), expires: new Date(Date.now() + (30 * 86400 * 1000)) 
  }));

但是

  app.use(express.session(
    { secret: "secret", store: new MemoryStore(), maxAge: Date.now() + (30 * 86400 * 1000) 
    }));

我也觉得这个功能很好用。


3
这是两种使用 Express 框架时设置 session 的方式: 第一种方式为:app.use(express.session({ secret: "secret", store: new MemoryStore(), expires: new Date(Date.now() + (30 * 86400 * 1000)) })); 第二种方式为:app.use(express.session({ secret: "secret", store: new MemoryStore(), maxAge: Date.now() + (30 * 86400 * 1000) }));这两种方式都可以正常运行,只是设置 session 过期时间的方式略有不同。请根据自己的需要选择适合自己的方式。 - Vadim Baryshev
1
MemoryStore 只在 express 应用程序运行期间存储会话。因此,如果您在任何时候重新启动服务器,则 cookie 不再链接到内存中的会话,并且 express 将要求您的用户再次登录。 - rdrey
11
也许我对这个机制的理解有误,但是,“expires”示例将相对于应用程序启动时设置一个到期日期,因此在应用程序启动一个月后,所有会话都将立即过期(包括此时创建的任何新会话)?而maxAge示例设置了一个“年龄”,即(当前时刻距离时代偏移量+30毫秒),大约是从应用程序启动开始的44年...难道它们不应该被包装在函数中或者其他什么东西中吗? - Stevie
7
为什么你的例子中要设置 "maxAge: Date.now() + (30 * 86400 * 1000)"?我的意思是,为什么在开始时要使用表达式 "Date.now()"?根据文档 https://www.npmjs.com/package/express-session#cookiemaxage ,它说:"这是通过取当前服务器时间并将 maxAge 毫秒添加到该值来计算过期日期时间。" - Daniel Carpio Contreras
4
不建议使用 downvoted - expires,使用 Date.now() 也是不正确的。这与IT有关。 - Sgnl
显示剩余3条评论

6

-3
app.use(express.session({
    secret  : 'sdfsdSDFD5sf4rt4egrt4drgsdFSD4e5',
    store   : new storage({ client : conn, cleanup: false }),
    cookie  : { maxAge  : new Date(Date.now() + (60 * 1000 * 30)) }
}));

1
你又把maxAge和expires弄混了。这个6年前的答案还是不正确:D请阅读Dong的回答:https://dev59.com/Y2gt5IYBdhLWcg3wxARj#30562724 - krivar

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