【问题标题】:Renewing/Refreshing Express Session更新/刷新快速会话
【发布时间】:2015-11-01 16:55:27
【问题描述】:

在我的应用中,如果用户未登录,我会限制对某些操作和页面的访问。我有:

var restrict = function(req, res, next) {
    if (!req.user) {
      console.log("USER isn't logged in.")
      return res.status(403).send('Access or action denied, please log in'); 
    }
    next();
}


app.get('/stocks', restrict, MainHandler.findAllStocksFromUser);
app.get('/stocks/:id', MainHandler.findStockByIdAndDates);
app.put('/stocks/:id/stockActions', restrict, MainHandler.handleStockAction);

我实际上是在每次客户端向服务器发出请求时尝试刷新会话,以便服务器不会在不应该注销用户/销毁会话时。为了进行测试,我希望会话过期/如果 20 秒后用户没有向服务器发出请求,则用户将被注销。我有:

    app.use(session({secret: 'secret', saveUninitialized: true, resave: true, expires: new Date(Date.now() + (20000))}));

然后我尝试使用中间件在每次使用发出请求时刷新过期日期:

// Session-persisted message middleware
app.use(function(req, res, next){
  req.session.cookie.expires = new Date(Date.now() + 20000);
  next();
});

但是,如果我从客户端登录并单击周围,导致向服务器发出请求,尽管尝试在中间件中“刷新”会话,但 20 秒后我仍然在客户端上收到登录错误。我也尝试过使用与中间件相同的策略来使用 maxAge。有任何想法吗?谢谢!

【问题讨论】:

标签: node.js express session-cookies passport.js session-timeout


【解决方案1】:

你可以尝试如下定义你的会话

app.use (
   session ({
      secret: "secret",
      saveUninitialized: true,
      resave: true,
      cookie: {
         expires: 20 * 1000
      }
   })
);

然后使用

刷新会话
req.session.touch()

或者你可以将你的会话定义为

app.use (
   session ({
      secret: "secret",
      saveUninitialized: false,
      resave: true,
      rolling: true,
      cookie: {
         expires: 20 * 1000
      }
   })
);

它会自动更新会话,并且只有当它为 expires 变量中的值空闲时才会过期

【讨论】:

    【解决方案2】:

    express-session 支持基于持续时间的maxAge 设置,这比为所有会话设置固定日期效果更好。所以你的中间件使用应该是这样的:

    app.use(session({
      secret: 'secret',
      saveUninitialized: true,
      resave: true,
      maxAge: 20000
    }));
    

    接下来,要更新会话的到期时间,您只需调用 req.session.touch();(如果您对会话及其内容所做的一切)。

    documentation 有很多其他关于控制会话过期和相关主题的好信息。

    【讨论】:

    • 这对我不起作用。如果我在每个请求上将 req.session.maxAge 打印到控制台,我会得到“未定义”。所以我尝试做 app.use(session({secret: 'secret', saveUninitialized: true, resave: true, cookie: {maxAge: 20000}}));相反,req.session.touch() 似乎不起作用,因为无论我提出多少请求,会话在 20 秒后仍然停止
    • @gcc 你有解决办法吗??
    • 我认为你必须使用 req.session.cookie.maxAge
    猜你喜欢
    • 2018-02-12
    • 2019-04-28
    • 2021-09-23
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2015-06-29
    • 2011-12-07
    相关资源
    最近更新 更多