Node.js 使用Express.js中的会话

Node.js 使用Express.js中的会话,node.js,session,express,Node.js,Session,Express,我需要帮助理解web应用程序会话的概念。我正在使用Express 3.0运行Node.js服务器 我的目标是: 为每个登录的用户创建会话 存储此会话并将其用于验证用户是否已登录(防止两台设备同时使用同一用户)以及限制对某些页面的访问(通过将会话ID与其他数据匹配) 我将使用MemoryStore保存会话(似乎最简单)。如果上述目标有意义,您能否详细解释如何实现这些目标?只有在不创建多个实例(例如使用群集模块)的情况下,才使用express中的MemoryStore。如果要跨计算机进行负载

我需要帮助理解web应用程序会话的概念。我正在使用Express 3.0运行Node.js服务器

我的目标是:
  • 为每个登录的用户创建会话

  • 存储此会话并将其用于验证用户是否已登录(防止两台设备同时使用同一用户)以及限制对某些页面的访问(通过将会话ID与其他数据匹配)


我将使用MemoryStore保存会话(似乎最简单)。如果上述目标有意义,您能否详细解释如何实现这些目标?

只有在不创建多个实例(例如使用群集模块)的情况下,才使用express中的MemoryStore。如果要跨计算机进行负载平衡,则负载平衡器将需要使用粘性/持久性会话

如果您满足这些要求,则只需在登录时执行,一旦验证凭据,请设置一个会话变量以指示已登录,例如:

req.session.loggedIn = true;
如果要检查用户是否登录,只需检查该变量即可

if (req.session.loggedIn) {
    // user is logged in.
}
else {
    // user is not logged in.
}
您提到了防止单个用户一次拥有多个会话。要实现这一点,您可能需要在数据库中存储一些指示用户已登录的内容。我警告你,这可能是危险的,因为过时的会话。例如,如果用户登录但从未注销,该怎么办?如果他们关闭浏览器窗口,会话就永远消失了怎么办

Express没有空闲会话过期的概念。我通过将所有会话与最后访问的时间戳一起存储在数据库中,然后根据时间定期清理会话数据,实现了这一点。但是,您还需要更新您的登录用户列表。

Express在github repo中有nice。其中一个处理并显示如何将用户附加到
req.session
对象。这是在
app.post('/login')
路由中完成的

要限制对某些页面的访问,请向这些路由添加一个简单的中间件

function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
});

您应该看一看我已经尝试使用passport,但无法使其正常工作,我认为在express中使用默认会话会更容易。您可能想阅读以下内容:会话是db/内存中唯一id的条目。下面详细介绍了会话在express中的工作方式。他可以覆盖上一个会话,以这种方式禁用旧会话,并防止“过时会话”成为问题?不确定他为什么需要在循环中使用粘性端口?与connect_redis一起使用循环将允许会话在网站的任何实例上工作。另外,作者声称这是一个错误,但在性能上可能损失的是在容错上获得的。@Neikos:我不需要完全实现那个机制,但很难绕过它。你有什么建议吗?请在此回答:您在哪里比较两个session_id和cookie id?您能告诉我,通过使用redis,我是否必须自己生成唯一的令牌,或者redis提供此功能??
var RedisStore = require('connect-redis')(express);

// add this to your app.configure
app.use(express.session({
  secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
  store: new RedisStore({ host: 'localhost', port: 3000, client: redis })
}));