Node.js - 会话不会通过 res.redirect() 持续存在

Posted

技术标签:

【中文标题】Node.js - 会话不会通过 res.redirect() 持续存在【英文标题】:Node.js - Session doesn't persist through res.redirect() 【发布时间】:2012-01-10 19:53:33 【问题描述】:

我(几乎)成功地将 Node.js 与 Express 和 Redis 一起使用来处理会话。

我遇到的问题是当我使用res.redirect() 时会话没有保留。

我是这样看的:

req.session.username = username.toString();
console.log(req.session);
res.redirect('/home');

console.log() 打印:

 lastAccess: 1322579131762,
  cookie:
    path: '/',
     httpOnly: true,
     _expires: Tue, 29 Nov 2011 15:06:31 GMT,
     originalMaxAge: 60000 ,
  username: 'admin' 

现在,代码如下:

app.get('/home', [app.requireLogin], function(req, res, next) 
// Not showing the rest as it's not even getting there
// Instead, here is what's interesting
app.requireLogin = function(req, res, next) 
  console.log(req.session);

这个 console.log() 打印出这个:

 lastAccess: 1322579131775,
  cookie:
    path: '/',
     httpOnly: true,
     _expires: Tue, 29 Nov 2011 15:06:31 GMT,
     originalMaxAge: 60000  

很明显,“用户名”对象已经消失了。会话没有保留它,只是重建了一个新的。

我该如何解决这个问题?如果您需要任何信息,请不要犹豫。

这是我设置会话管理的代码:

app.configure(function() 
  // Defines the view folder and engine used.
  this.set('views', path.join(__dirname, 'views'));
  this.set('view engine', 'ejs');

  // Allow parsing form data
  this.use(express.bodyParser());

  // Allow parsing cookies from request headers
  this.use(express.cookieParser());
  // Session management
  this.use(express.session(
    // Private crypting key
    secret: 'keyboard cat',
    store: new RedisStore,
    cookie: 
      maxAge: 60000
    
  ));
  this.use(app.router);
);

这是整个项目(我的意思是它的一部分),要点:https://gist.github.com/c8ed0f2cc858942c4c3b(忽略渲染视图的属性)

【问题讨论】:

能否将代码粘贴到包含 Redis 会话存储的位置?那里有一个超时选项,可能你不小心把它设置得太低了。 已添加 :) 设置为 60 秒,我显然不使用 60 秒来编写凭据... 我认为这是一个小项目,我认为最好将其发布在某个地方(要点,粘贴)并提供链接。我敢打赌,错误出在您未粘贴的代码中。 (只是猜测) 最后添加了要点链接 @Florian 我投票给你。这是我能为你做的最多的事情:-) 【参考方案1】:

好的,我找到了解决方案。问题是maxAge 中的时间被添加到当前日期。因此,在浏览器端,cookie 被设置为在显示的 GMT 时间过期。

问题如下:我使用虚拟机来测试 node.js,而且,你知道...有时,你会挂起你的机器。

嗯,发生的事情是机器的时间晚了两天。因此,每当在服务器端设置 cookie 时,客户端都会认为 cookie 已经过期,因为我的主机并没有迟到两天。

另一个愚蠢的结果。

【讨论】:

嘿,我也有类似的问题。你能帮我吗? ***.com/questions/64512910/…【参考方案2】:

你试过不同的浏览器吗?您是否在页面重定向之间保持相同的会话 ID?

您可以在重定向之前添加req.session.cookie.expires = false;...

【讨论】:

【参考方案3】:

您的代码看起来很可靠,但是您使用 client.end() 有什么原因吗?强行关闭redis连接,不干净。我认为你根本不需要它:

https://github.com/mranney/node_redis/issues/74

我不确定 connect-redis 的底层架构,但我想知道调用 client.end 是否会重置会话。如果你把它们拿出来会怎样?

【讨论】:

谢谢,我不知道。我以为它会更干净。虽然它并没有解决问题,但我正在为你 +1 :)【参考方案4】:

我遇到了类似的问题,因为我在会话中设置了一些在设置的 app.get() 之外没有持续存在的东西。

我的问题原来是我没有在我的app.get() 末尾做一个res.redirect()。看起来我在请求对象上设置了一些东西,然后允许它收集垃圾。

我添加了一个res.redirect( '/nextmethod' ),数据仍然很好。

【讨论】:

【参考方案5】:

您当然需要以某种方式保存该会话,这可能有效。

req.session.regenerate(function()
    req.session.username = username.toString();
    res.redirect('/home');
);

【讨论】:

不幸的是,这并没有改变任何东西。顺便问一下,这个 regenerate 函数有什么意义? 如果您要修改存储在持久性数据库中的数据,您需要先保存它,然后才能在系统的其他部分使用它,这是合乎逻辑的。我很惊讶 req.session.username 变量持续存在而不保存任何东西......也许它是作为一个功能自动完成的

以上是关于Node.js - 会话不会通过 res.redirect() 持续存在的主要内容,如果未能解决你的问题,请参考以下文章

没有 req.session.save() 会话不会保存在 Node.js 中

Keycloak node.js 适配器不会在注销时使 connect.sid 会话 cookie 无效

Node.js刷新session过期时间

Angular.js 的 Node.js CORS 会话 cookie

重定向时丢失会话(node.js + socket.io)

Node.js Express Spotify API保存在会话中