会话ID对于不同的客户端Nodej是相同的

时间:2015-04-13 10:33:45

标签: node.js session cookies express session-cookies

目前,我们正在使用express-session passport.jsconnect-redis在Cookie中设置会话,以便将数据存储在redis中。 我有多个节点服务器服务请求。对于没有会话的每个请求,我正在创建一个新会话。有时,会将现有会话ID分配给新请求。在创建一个唯一的会话之前,我正在检查cookie是否在那里......如果是,那么我不会创建一个新的会话。但是在这样做的同时,我们看到相同的会话ID与不同的客户端共享。 我怎么知道它是一样的? 第一个用户尝试登录,它会成功登录并设置会话并提供有关用户配置文件的正确信息。 第二个用户尝试登录,它提供了成功的登录,但将会话设置为先前的,即第一个用户的会话,因此第二个用户在配置文件部分中看到第一个用户信息。

会话实施代码:

function sessionImplementation() {
    return function (req, res, next) {
        if(/ucompany=s%3A/.test(req.headers['cookie'])){
            var cookie = req.headers['cookie'].split("ucompany=s%3A");
            var zCookie = cookie[1].split(".");
            var genid = zCookie[0];
            return session({
                genid:function () {
                    return genid;
                },
                store: redis,
                cookie: {
                    maxAge: new Date(Date.now() + (7 * 24 * 60 * 60 * 1000))
                },
                secret: 'ucomp123',
                resave: false,
                name: "ucompany",
                saveUninitialized: true
            })(req, res, next)

        }
        return session({
            store: redis,
            cookie: {
                maxAge: new Date(Date.now() + (7 * 24 * 60 * 60 * 1000))
            },
            secret: 'ucomp123',
            resave: false,
            name: "ucompany",
            saveUninitialized: true
        })(req, res, next)
    }
}

问题是什么?我该如何解决?

更新1 根据@robertklep,我修改了我的代码。

var express         = require('express');
var session         = require('express-session');
var RedisStore      = require('connect-redis')(session);
var cookieParser    = require('cookie-parser');
var bodyParser      = require('body-parser');
var passport        = require('passport');

var app = express();
app.use(bodyParser.json());// to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ extended: false }));
app.use(compress());
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

//app.use(cookieParser());
var redis = new RedisStore({
  host:config.redis.url,
  port:config.redis.port, 
  prefix:'sess-'+new Date().getDate()+'-'+(new Date().getMonth()+1)+'-'+new Date().getFullYear()+':'
});
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
    store: redis,
    cookie: {
        expires: new Date(Date.now() + (7 * 24 * 60 * 60 * 1000)),
        maxAge:7 * 24 * 60 * 60 * 1000
    },
    secret: 'ucomp123',
    resave: false,
    name: "ucomapny",
    saveUninitialized: true
}));

app.use(passport.initialize());
app.use(passport.session());

2 个答案:

答案 0 :(得分:2)

您的代码存在以下问题:

  • 而不是让express-session处理会话Cookie,而是您自己尝试处理它们;
  • 你为每一个请求实例化会话中间件,这是浪费资源而可能也会导致问题(我还没有挖到express-session深足以对此作出任何明确的主张;)
  • maxAge(对于cookie)不应该是日期而是一个数字(从现在开始的毫秒数,cookie应保持有效);您将其与expires混淆, 用于设置时间点;

使用它的常规方式如下:

var session = require('express-session');
var express = require('express');
var app = express();
...
app.use(session({
  store  : redis,
  cookie : { maxAge : 7 * 24 * 60 * 60 * 1000 },
  secret : 'ucomp123',
  name   : 'ucompany',
  resave : false,
  saveUninitialized : true
});

答案 1 :(得分:0)

哪里是genid?

你必须自己生成它。使用uuid包