Nodejs Express session超时问题

Nodejs Express session超时问题

下面代码只能登录后操作10秒,就直接过期退出: app.use(express.session({ secret: config.secret, cookie: {httpOnly: true, maxAge: 10000},//10 秒 store: new MongoStore(config.db) }));

Express很奇怪,我想要跟J2ee似得,如果登录后,没有操作超过10秒,才过期退出。。请高手答复。

4 回复

Node.js Express Session 超时问题

在使用 Express 和 express-session 中间件时,配置 session 的超时时间是一个常见的需求。你提到的代码中,session 的 maxAge 设置为 10 秒,这意味着从用户登录开始计算,10 秒后 session 就会过期。这显然不是你想要的效果。

你希望的是,只要用户在 10 秒内没有进行任何操作,session 才会过期。这实际上是 session 的默认行为,因为 session 的超时时间通常指的是在一定时间内没有任何请求的情况下才会失效。

解决方案

为了实现你的需求,你可以调整 session 配置中的 rolling 属性。将 rolling 设置为 true,这样每次请求都会重新设置 session 的过期时间。

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const app = express();

app.use(session({
    secret: config.secret,
    cookie: {
        httpOnly: true,
        maxAge: 10000 * 60 * 60 // 10小时
    },
    rolling: true, // 每次请求都会重置超时时间
    store: new MongoStore(config.db)
}));

app.get('/', (req, res) => {
    req.session.views = (req.session.views || 0) + 1;
    res.send(`You visited this page ${req.session.views} times`);
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  • maxAge: 设置 session 的最大存活时间(以毫秒为单位)。在这个例子中,设置为 10 小时(10000 * 60 * 60)。
  • rolling: 当设置为 true 时,每次请求都会重新设置 session 的过期时间。这意味着只要用户在 10 小时内有任何活动,session 就不会过期。
  • store: 使用 MongoStore 存储 session 数据到 MongoDB。

通过这种方式,即使用户在 10 小时内没有任何活动,只要他们再次发起请求,session 就会被刷新,从而延长其有效期。这样可以确保用户在 10 小时内有任意活动,session 就不会过期。


没有操作,要自己在session记录下上次操作时间把,超过10秒就退出了

谢谢楼上,有更简单、方便的方法吗?比如第三方库能解决

在Node.js中使用Express处理session超时问题时,可以通过调整session配置中的maxAge属性来实现。您当前设置的maxAge: 10000(即10秒)确实导致了session在用户无操作的情况下10秒后就失效。为了达到您的需求,即用户登录后,在一段时间内(例如30分钟)没有进行任何操作才会使session失效,您可以将maxAge设置为一个较大的值。

示例代码如下:

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

const app = express();

app.use(session({
    secret: config.secret,
    cookie: {
        httpOnly: true,
        maxAge: 30 * 60 * 1000 // 30分钟
    },
    store: new MongoStore(config.db) // 使用MongoDB作为session存储
}));

// 其他中间件和路由定义

app.listen(3000, () => console.log('Server is running on port 3000'));

在此示例中,我们将maxAge设置为30 * 60 * 1000,即30分钟。这意味着用户登录后,在30分钟内没有任何操作,session才会自动过期。如果用户在这段时间内有任何交互(如页面浏览、表单提交等),session会重置计时器,延长session的有效期。

这样设置后,session将根据用户的实际活动动态地延长有效期,而非固定时间后立即过期,这更符合您所描述的需求。

回到顶部