NodeJS redis 连接会话 ID 在应该保持不变时重新生成
Posted
技术标签:
【中文标题】NodeJS redis 连接会话 ID 在应该保持不变时重新生成【英文标题】:NodeJS redis connect session ID is regenerated when it should stay persisted 【发布时间】:2012-03-16 04:15:32 【问题描述】:我尝试在 NodeJS 中使用 Redis 的标准会话持久性:
var express = require('express');
var RedisStore = require('connect-redis')(express);
var app = module.exports = express.createServer();
// Configuration
app.configure(function()
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session(
secret: "keyboard cat",
store: new RedisStore,
key: 'sid'
));
);
app.get('/', function (req, res)
if (req.session.isValid)
console.log("There is an existing session.");
else
req.session.isValid = true;
console.log("New session.");
console.log('Old session ID: ' + req.header('Cookie'));
console.log('New session ID: ' + req.session.id);
res.render('index', 'title': s);
);
app.listen(4000);
理论上我应该看到“新会话”这一行。网站站点的所有后续调用都应导致“存在现有会话”。 不幸的是,每次通话都会重新生成一个新的会话 ID。浏览器中的cookie工作正常,内容正确传输,我可以在
中看到req.header('Cookie')
这是控制台日志的样子:
[app.js] New session.
[app.js] Old session ID: undefined
[app.js] New session ID: nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE
[app.js] New session.
[app.js] Old session ID: sid=neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO%2FxykJPN5R5tjAlQc
[app.js] New session ID: FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ
[app.js] New session.
[app.js] Old session ID: sid=pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme%2BJh8sQC6%2FzEE
[app.js] New session ID: KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI
同时我在redis-cli中运行“MONITOR”命令时得到如下输出:
sess:nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE
*2
$3
get
$73
sess:Q6Z06GL4hdRytKA2MToCIgVw.JWxImSB/m20Urn+IYMQqnNqfQp4ygAESiyBLORn3Iuo
*2
$3
get
$73
sess:neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO/xykJPN5R5tjAlQc
*2
$3
get
$73
sess:FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ
*2
$3
get
$73
sess:zvCWdwzowgAfl6jH8m0D31vL.b5tK5VZUJtPHrdvH09A/hjhjoOg6bT0CmAcWWRf99SI
*2
$3
get
$73
sess:pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme+Jh8sQC6/zEE
*2
$3
get
$73
sess:KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI
*2
$3
get
$73
sess:r793eaJyOnaq2RNyw1Hmpuwv.xnonbOlaWEAlpz+LDg0SHcUeAa0sbjyw0oIcwFmlX0w
当我使用 MemoryStore 而不是 RedisStore 时,一切正常。
有什么想法吗?
【问题讨论】:
嗨 Raph - 你解决了吗?我有同样的问题:/ 看来升级到较新的 Redis 版本可以解决问题。但是我还是不知道问题出在哪里。 您使用的是 2 个节点吗?我的意思是一个用于服务器作为 nodejs,另一个用于客户端接口,如 react 【参考方案1】:我有类似的问题。我的会话根据每个请求重新生成。我通过在进行开发的虚拟机上设置适当的日期来解决它。
【讨论】:
您的意思是,App VM 和 Redis VM 之间的日期不同?差异有多大?【参考方案2】:试试这个..
let redisStore,redisClient;
const redis = require('redis');
redisStore = require('connect-redis')(session);
redisClient = redis.createClient();
redisClient.on('error', (err) =>
console.log('Error: ', err);
);
app.use(session(
store : new redisStore( host: 'localhost', port: 'port', client: redisClient ),
name : 'session_name',
resave : false,
saveUninitialized: false,
rolling : true,
));
注意:redis 不支持 window/localhost。
【讨论】:
【参考方案3】:每次请求都重新生成会话时,我遇到了同样的问题。原因是“静态”中间件被放置在“会话”下面。所以,一定要按正确的顺序放置中间件,即:
...
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.session( store: new RedisStore( prefix: 'sid_' ) ));
app.use(app.router)
app.get ...
“express.session”中间件应该在“静态”下。
【讨论】:
以上是关于NodeJS redis 连接会话 ID 在应该保持不变时重新生成的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs + Passport.js + Redis:如何在 Redis 中存储会话
为啥我应该在 MongoDB 中使用 NodeJS 在会话案例中搜索用户?