【问题标题】:NodeJS Redis Session does not persist over browser redirectsNodeJS Redis 会话不会在浏览器重定向中持续存在
【发布时间】:2015-01-28 04:41:02
【问题描述】:

我对 node 还是很陌生,正在尝试使用 express + redis 进行会话管理。

我当前的项目要求将用户重定向到外部站点进行身份验证。身份验证后,浏览器被重定向到我指定的回调 url。我需要会话数据在重定向中保持不变。

我的实现如下:

  1. 用户触发对 nodeJS 服务器的 POST 调用,我通过req.session.foo = 'bar' 将数据持久化到会话,然后将 auth_url 返回到浏览器。
  2. 浏览器使用window.location.replace(auth_url); 重定向到外部站点进行身份验证
  3. 身份验证后,浏览器被重定向到localhost:3000/mycallbackurl,这是一个定义如下的路由(请原谅格式不佳):

router.get('/mycallback', function(req, res) {

  console.log("data at callback: " + req.session.foo);
  //do other stuff

});

我现在的问题是控制台在回调路由处打印:data at callback: undefined

这是我的 redis 设置的问题,还是我在这里遗漏了什么?

到目前为止,我已经通过在每次浏览器刷新时递增 req.session 中存储的值并打印它来确定 redis 正在工作。

我的redis设置如下:

var session = require('express-session');
var RedisStore = require('connect-redis')(session);
app.use(cookieParser());
app.use(session({ store: new RedisStore({
    host: 'localhost',
    port: 6379,
    db: 1,
    cookie: { maxAge: (24*3600*1000*30)},
}), secret: 'keyboard cat',
    saveUninitialized: true,
    resave: true
}));

感谢您的阅读,期待您的回复!

【问题讨论】:

    标签: javascript node.js session redis session-cookies


    【解决方案1】:

    在重定向 (res.redirect) 之后,重新创建 res 和 req 对象。这意味着如果您向这些对象添加了任何参数,您需要确保在每个请求中将它们重新添加到 req 或 res 对象中。

    【讨论】:

    • 我正在使用 Redis 将数据保存到磁盘,然后在重定向后访问该数据。我的实现不正确吗?感谢您的回复!
    • 我的意思是你需要为每个请求重新分配一个值到 req.session.foo 。该值是否来自 Redis 或其他地方并不重要。我查看了您的代码,但没有看到对 req.session.foo 的任何赋值,因此当您引用它时它将是未定义的。
    • 再次感谢您的回复。在回调路由中,我需要之前在req.session.foo 中的数据。如何在重定向后保留数据并检索它? Redis 肯定可以帮助我实现这一目标吗?
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2017-04-19
    • 2014-01-19
    • 1970-01-01
    • 2016-04-14
    • 2014-02-12
    相关资源
    最近更新 更多