每次请求都要更改会话

Blu*_*ueS 2 session redis node.js

我有登录功能

app.post('/doLogin', function(req,res){
        db.users.findOne({username: req.body.username}, function(err, user) {
            if( err ) {
                console.log("Login fail");
            } 
            else if (user != null) {
                if (req.body.password == user.password) {
                    req.session.user_role = "user";
                    req.session.save();
            } else {
                req.session.user_role = "null";
                console.log("Wrong login");
            }
        }
        res.send({redirect: "/"});
    });

});
Run Code Online (Sandbox Code Playgroud)

此函数用于将变量保存到会话中req.session.user_role = "user"; 但是当新请求检查用户是否登录时

app.get('/', function(req,res){
    redis.get('sess:' + req.session.id, function(err, result){
        console.log("Get session: " + util.inspect(JSON.parse(result),{ showHidden: true, depth: null }));
    });
    if ((req.session.user_role == "user")) {
          console.log("Logged in");
    } else {
        console.log("Logged out");
    }
});
Run Code Online (Sandbox Code Playgroud)

然后返回始终为"已注销",因为会话已更改.我使用Redis存储会话,我认为这是Redis故障,因为当我停止使用Redis时,它可以帮助我!

Nir*_*rus 15

Express-session使用cookie来设置或从客户端获取会话ID

文件中所述

请注意,secure:true是推荐选项.但是,它需要启用https的网站,即安全cookie需要HTTPS.如果设置了安全,并且您通过HTTP访问您的站点,则不会设置cookie.

请记住以下几点:

  • 如果您未在HTTPS连接上托管,则应将安全标志设置为false.

  • 如果您使用的是HTTPS上托管的代理,则应将信任代理设置为1.请参阅文档


以下选项将解决每个请求的会话ID重置问题

cookie: { secure: false }
Run Code Online (Sandbox Code Playgroud)

例如:

app.use(session({
  // your settings
  cookie: { secure: false }
}))
Run Code Online (Sandbox Code Playgroud)