【问题标题】:How to exclude routes from renewing express cookie expiration date如何从更新 express cookie 到期日期中排除路由
【发布时间】:2016-11-05 04:25:38
【问题描述】:

使用express jsexpress-session 我有这个主要的经典会话中间件,它将cookie 的maxAge 定义为一小时。

var express         = require('express');
var session         = require('express-session');
var RedisStore      = require('connect-redis')(session);

var ExpressServer = express();

ExpressServer.use(
    session(
        {
            secret              : 'secret',
            //  Forces session to be saved even when unmodified
            resave              : false,
            rolling             : true,
            //  Forces session to be saved even when unmodified
            saveUninitialized   : true,
            //  Controls result of unsetting req.session (through delete, setting to null)
            unset               : 'destroy',
            cookie: {
                path: '/',
                proxy: secureCookie,
                secure: secureCookie,
                httpOnly: true,
                maxAge: 1000 * 60 * 60
            },
            store: new RedisStore(
                {
                    client: RedisClient
                }
            )
        }
    )
);

但是,我有一些从客户端到服务器定期(每 30 秒)调用的路由,假设其中之一是:

ExpressServer.get(
'/periodic',
function (req, res, next) {
    //doSomthing()
}

由于此路由是从客户端定期调用的,因此我需要它不会导致 cookie 到期日期的更新(以防用户将浏览器保持打开状态)并保留当前到期日期(从最后一个不-定期路由调用)

我怎样才能实现它?

【问题讨论】:

    标签: node.js session express cookies express-session


    【解决方案1】:

    只需将ExpressServer.get('/periodic') 调用放在ExpressServer.use(session()) 调用之前。或者您可以执行以下操作:

    var url = require('url');
    var normalSessionOpts = {
        secret              : 'secret',
        //  Forces session to be saved even when unmodified
        resave              : false,
        rolling             : true,
        //  Forces session to be saved even when unmodified
        saveUninitialized   : true,
        //  Controls result of unsetting req.session (through delete, setting to null)
        unset               : 'destroy',
        cookie: {
            path: '/',
            proxy: secureCookie,
            secure: secureCookie,
            httpOnly: true,
            maxAge: 1000 * 60 * 60
        },
        store: new RedisStore(
            {
                client: RedisClient
            }
        )
    };
    var nonRollingSessionOpts = Object.assign({}, normalSessionOpts, { rolling: false });
    var normalSession = session(normalSessionOpts);
    var nonRollingSession = session(nonRollingSessionOpts);
    
    ExpressServer.use(function (req, res, next) {
        var parsedUrl = url.parse(req.url)
        return parsedUrl.pathname === '/periodic'
            ? nonRollingSession(req, res, next)
            : normalSession(req, res, next);
    });
    

    【讨论】:

    • 关于你的第一个选项,我试过了,但它似乎没有帮助,因为 maxAge 参数与之前的调用保持不变,所以无论如何它都会更新它。你能解释一下你的第二个选择吗?关闭rolling 选项对这里有什么帮助? maxAge 仍然会影响会话。
    • @TomG according to the documentationrolling 设置为true 表示“过期重置为原来的maxAge,重置过期倒计时。”因此,为该特定路由将其设置为 false 意味着会话 cookie 不会更新为新的过期时间。
    • 好吧,我试过了,没用。我确实“触摸”了会话,所以也许这就是问题所在?我需要使用会话数据,而不是更新到期日期
    猜你喜欢
    • 1970-01-01
    • 2022-08-05
    • 2021-08-16
    • 2011-06-19
    • 2011-08-10
    • 1970-01-01
    • 2016-08-22
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多