存储在redis中的匿名会话用于匿名

时间:2015-08-31 10:11:02

标签: node.js session express redis

我正在将Express 4.0与模块express-sessionconnect-redispassport一起用于管理会话。一切都可以登录和注销,我可以检索会话等。

但我注意到一些奇怪的事情:即使我是匿名的,如果我要去redis并打字:

$ KEYS *

即使当前没有人连接,Redis也会返回条目1) "sess:VWdwTjPXkITmqQ77xI8cotlltdrz7S8s"。当我连接时,此键将被另一个与我的会话相对应的键替换。当我退出时,密钥又被另一个密钥更改。当匿名用户调用URL时,我的req.sessionID也已设置。

在这个网站https://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile我已经阅读了一些关于创建会话的内容,即使对于匿名(7.无会话),我认为它是相关的。

我在app.js主文件中添加了midwhere:

var
  passport = require('passport'),
  User = require('../models/user'),
  LocalStrategy = require('passport-local').Strategy,
  session = require('express-session'),
  RedisStore = require('connect-redis')(session);

app.use(session({
  store: new RedisStore(app.locals.services.session.config),
  secret: 'mysecretstring'
}));

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

passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

即使我从一台新服务器开始,如果我尝试获取我无所事事的主页,我也遇到了问题:

index: function (req, res) {
  res.render('home/index');
}

即使在这种情况下,我的redis中也会创建一个新密钥。

注意: 如果我删除这两行,则不会创建任何键。

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

所以,我的问题是:如何避免在Redis中为匿名用户创建密钥? (而且,不存储匿名会话是个好主意吗?)。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您不希望为每个请求创建新会话,请在false中间件中将saveUninitialized设置为express-session

app.use(session({
  store             : new RedisStore(app.locals.services.session.config),
  secret            : 'mysecretstring',
  saveUninitialized : false,
}));