【发布时间】:2015-06-18 15:19:03
【问题描述】:
目前我们正在使用express-session 与passport.js 和connect-redis 在cookie 中设置会话以将数据存储在redis 中。
我有多个节点服务器服务请求。对于没有会话的每个请求,我正在创建一个新会话。有时,现有会话 ID 被分配给新请求。在创建唯一会话之前,我正在检查 cookie 是否存在……如果存在,那么我没有创建新会话。但是在这样做的同时,我们看到相同的会话 ID 与不同的客户端共享。
我怎么知道它是一样的?
第一个用户尝试登录,它成功登录并设置会话并提供有关用户配置文件的正确信息。
第二个用户尝试登录,它成功登录,但将会话设置为前一个,即第一个用户的会话,因此第二个用户在配置文件部分看到第一个用户信息。
Session 实现代码:
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-sessionwill handle session cookies itself,所以我不确定你为什么要重新实现它。 -
什么意思?我没有重新实现任何东西。
-
您自己解析会话 cookie,并为每个请求重新实例化
express-session中间件。 -
在自述文件中,写着
app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true, cookie: { secure: true } }))这就是我正在做的。我仍然不明白我正在重新实现相同的意思。不应该是这样的吗? -
这绝对是不是你在做什么。尝试使用
README中描述的方法(当然要使用正确的选项),看看是否能解决您的问题。
标签: node.js session cookies express session-cookies