将express js
与express-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的到期日期更新(如果用户离开浏览器)并且保留当前的到期日期(从最后一次没有 - 定期路线呼叫)
我怎样才能实现它?
答案 0 :(得分:-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);
});