目前,我们正在使用express-session
passport.js
和connect-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());
答案 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包