2012-02-26 46 views
10

会话ID再生我试图用在与的NodeJS Redis的标准会话持久性:的Redis的NodeJS连接时,它应该保持持续

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 

同时我得到的

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 

当我使用RedisStore的MemoryStore的insteand,一切工作像预期:在Redis的-CLI运行 “MONITOR” 命令时,下面的输出。

任何想法?

+0

HI Raph - 你解决了吗?我遇到了同样的问题:/ – UpTheCreek 2013-05-14 09:30:58

+0

看来升级到更新的Redis版本的确有窍门。但我仍然不知道问题出在哪里。 – Raph 2013-07-31 15:39:16

回答

0

我有类似的问题。每次请求我的会话都会重新生成。我通过在开发发生的虚拟机上设置适当的日期来解决这个问题。

+0

您的意思是,应用程序虚拟机和Redis VM之间的日期有所不同?差异有多大? – UpTheCreek 2013-05-14 09:33:22

-1

当每次请求重新生成会话时,我遇到同样的问题。原因是“静态”中间件放置在“会话”之下。所以,一定要放在中间件按照正确的顺序,即:

... 
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”中间件应该是在“静态”。