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

目前,我们正在使用express-sessionpassport.jsconnect-redis将数据存储在connect-redis从而在cookie中设置会话。 我有多个节点服务器服务请求。 对于没有会话的每个请求,我正在创build一个新的会话。 有时候,一个现有的会话ID被分配给一个新的请求。 创build一个独特的会话之前,我正在检查cookie是否存在…如果是,那么我不创build一个新的会话。 但是在这样做的时候,我们看到同一个会话ID被不同的客户端共享。 我怎么知道它是相同的? 第一个用户尝试login,它使login成功,并build立会话,并提供有关用户configuration文件的正确信息。 第二个用户尝试login,它会提供成功的login,但将会话设置为先前的第一个用户会话,因此第二个用户将在configuration文件部分看到第一个用户信息。

会议执行代码:

 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()); 

你的代码有几个问题:

  • 而不是让express-session处理会话cookie,你正试图自己处理它们;
  • 你正在为每一个请求实例化会话中间件,这是浪费资源, 也可能导致问题(我还没有深入到足够深入的express-session ,以作出任何明确的要求);
  • maxAge (对于cookie)不应该是一个date,而是一个数字( 从现在起 ,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 }); 

哪里是一个genid?

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