NodeJS 在Connect/Express中使用cookieSession()时为会话设置单个maxAge

zf2sa74q  于 2023-06-05  发布在  Node.js
关注(0)|答案(6)|浏览(545)

我尝试使用Connect/Express cookieSession(),以便将我的node.js会话存储在cookie中(从而避免服务器端会话存储)。这将帮助我在用户登录时“记住”他们,并在服务器重新启动后保持会话活动。
我想用cookieSession()来实现:

app.use( express.cookieSession( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
    if ( req.method == 'POST' && req.url == '/login' ) {
      if ( req.body.remember ) {
        req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
      } else {
        req.session.cookie.expires = false;
      }
    }
    next();
});

但是,这不起作用,因为req.session.cookie未定义。我也尝试了以下方法,但似乎不起作用:

app.use( express.session( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
    if ( req.method == 'POST' && req.url == '/login' ) {
      if ( req.body.remember ) {
        req.cookies['connect.sess'].maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
      } else {
        rreq.cookies['connect.sess'].expires = false;
      }
    }
    next();
});
yxyvkwin

yxyvkwin1#

app.use(express.cookieSession({ secret: config.server.cookieSecret }));

然后改成

app.use(function(req, res, next) {
  express.cookieSession({
    secret: config.server.cookieSecret,
    cookie: {
      maxAge: req.param('remember') ? 20000 : 3000
    },
  })(req, res, next);
})

因此,我们创建自己的中间件,包裹在cookieSession中间件周围,根据参数更改maxAge。
因此,无论何时更改会话,都需要在bodyqueryparams中传递remember(这就是req.param()的位置)。在大多数情况下,您只在登录时为会话设置一次user_id
它的3秒或20秒来测试,并确保它的工作。
同样,如果你在会话中设置了很多东西,这可能不是很有帮助,但是如果你只是在登录时将user_id设置为会话,这就是你所需要的。
如果你在会话中设置了很多东西,你应该知道每次请求都会传递数据,你应该只保存最少的数据到会话中,比如user_id,然后查找每个请求所需的数据,以减少用户的开销。

oprakyz7

oprakyz72#

我想这就是你想要的:

// Using express.session instead of express.cookieSession
app.use(express.session({ secret : 'secret_key' }));

app.use( function (req, res, next) {
  if ( req.method === 'POST' && req.url === '/login' ) {
    if ( req.body.remember )
    {
      req.session.cookie.maxAge = 30*24*60*60*1000;
      // needed to make the session `dirty` so the session middleware re-sets the cookie
      req.session.random = Math.random();
    }
    else
    {
      req.session.cookie.expires = false;
    }
  }
  next();
});

cookieSession做了一些时髦的东西,比如del req.session.cookie(不知道为什么)。

luaexgnf

luaexgnf3#

您必须先设置req.session.cookie,以便可以设置maxAge。在设置之前尝试使用它会给出req.session.cookie is undefined
express.cookieSession有它接受的默认值,见这里。你应该提到你将要使用的所有参数。您可以通过以下方式设置cookie:

app.use(express.cookieSession({ secret: 'secret_key', cookie :{ path: '/', httpOnly: true, maxAge: 30*24*60*60*1000} });
qfe3c7zg

qfe3c7zg4#

有点晚了,但我想这个答案可能会帮助人们前进...
我使用的是 cookie-session,它不会在request.session上创建cookie对象。为了使用request.session.cookie正确实现rememberMe功能,我将 cookie-session 切换为 express-session,这解决了所有问题。所以现在会话上有一个cookie对象,并且可以在请求中执行此操作...
npm install express-session

app.post('/login', function(request, response, next) {
    passport.authenticate('local', function(err, user, info) {
        if(err) return next(err);
        if(!user) {
            request.flash('loginMessage', info.message);
            return response.redirect('/account/login');
        }

        request.login(user, function(err) {
            if(err) return next(err);

            if(request.body.rememberMe)
                request.session.cookie.maxAge = 2592000000;
            else
                request.session.cookie.expires = false;

            return response.redirect(options.redirect);
        });
    })(request, response, next);
});
7gyucuyw

7gyucuyw5#

这也很晚了,但它可能会帮助其他人。
在我看来,持久化会话数据的最好方法是将其存储在类似redis的东西中。这个问题要求一种不使用服务器存储的方法,但我认为他更多地是指MemoryStore。也许不是,但无论如何,这就是我所做的。
我使用了express-session和connect-redis

npm install -g connect-redis
npm install -g express-session

然后你配置东西。

// session modules
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session')
var redisStore = require('connect-redis')(session); // this sets up Redis to work with your session cookies
var app = express();

然后,您只需将store选项设置为redisStore即可启动会话。maxAge部分将每个会话的生存期设置为一个小时,会话中间件在访问它时重置它。

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({ 
    store: new RedisStore({
        host:'127.0.0.1',
        port:6380,
        prefix:'sess'
    }),
    cookie: {maxAge: 3600000 },
    secret: 'session_secret' 
}));

现在,当客户端连接时,express应该自动将会话数据存储在Redis数据结构中。因为它不只是缓存在内存中,所以服务器可能会崩溃,但在指定的IP地址和端口上仍然可以使用所有相关的会话数据。

iecba09b

iecba09b6#

Yummy似乎允许在创建后修改cookie过期。

相关问题