【发布时间】:2016-03-18 04:54:47
【问题描述】:
我正在使用 Nodejs 和 express 来创建一个网络应用程序。但我发现维持会话有些困难。我可以使用 req.session.userid = userid ,但它不是那么可靠。如果服务器停机一段时间并且必须重新启动,会话将丢失。有没有什么方法可以更有效地存储会话?
【问题讨论】:
我正在使用 Nodejs 和 express 来创建一个网络应用程序。但我发现维持会话有些困难。我可以使用 req.session.userid = userid ,但它不是那么可靠。如果服务器停机一段时间并且必须重新启动,会话将丢失。有没有什么方法可以更有效地存储会话?
【问题讨论】:
您可以使用上述数据库,也可以使用内存存储,如 redis。 Redis 是处理用户会话时的首选方式,因为它的几个因素比从磁盘读取要快。
此外,您可能希望查看 Json Web Token,因此您根本不必存储会话,而只需在数据库(或 redis)中保留对用户令牌的引用。这将使您可以轻松地在移动设备上进行身份验证。如果您将令牌存储在用户本地存储(而不是 cookie)上,它还可以帮助防止 csrf 攻击
您可以在此处阅读它们:https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication、https://scotch.io/tutorials/the-anatomy-of-a-json-web-token、https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens
【讨论】:
我更喜欢使用名为“connect-mongodb-session”的 npm 模块。它使用 mongodb 存储所有会话。转到您的项目目录并使用
安装“connect-mongodb-session”sudo npm install connect-mongodb-session
并将其作为依赖项添加到您的 package.json 中。这就是你可以使用它的方式..
示例代码...
var express = require('express');
var session = require('express-session');
var MongoDBStore = require('connect-mongodb-session')(session);
var app = express();
var store = new MongoDBStore({
uri: 'mongodb://localhost:27017/connect_mongodb_session_test',
collection: 'mySessions'
});
// Catch errors
store.on('error', function(error) {
assert.ifError(error);
assert.ok(false);
});
app.use(require('express-session')({
secret: 'This is a secret',
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
},
store: store
}));
server = app.listen(3000);
你很高兴......随时使用 req.session,你的会话将保存在 mongodb 中。
例如..
app.post("/login",function(req,res){
//validate login
req.session.userid = userid;
})
即使服务器必须重新启动,您的会话也不会丢失。
【讨论】: