我正在尝试使用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();
});
答案 0 :(得分:2)
从
开始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。
因此,无论何时更改会话,您都需要在remember
,body
或query
中传递params
(req.param()
看起来)。在大多数情况下,您只需在登录时将user_id
设置为会话一次。
测试并确保其正常工作为3秒或20秒。
同样,如果你正在为你的会话设置很多内容可能不是很有帮助,但是如果你只是在登录时将user_id设置为session,那么这就是你所需要的。
如果要为会话设置大量内容,您应该知道每次请求都会传递数据,并且您应该只保存会话的最小值,例如user_id,然后查找每个请求所需的数据,以减少用户的开销。
答案 1 :(得分:1)
我认为这可以做你想要的:
// 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
(不知道为什么)。
答案 2 :(得分:0)
您必须先设置req.session.cookie
,以便设置maxAge
。在设置之前尝试使用它会产生req.session.cookie is undefined
express.cookieSession
具有接受的默认值,请参阅here。您应该提到您要使用的所有参数。您可以通过以下方式设置cookie:
app.use(express.cookieSession({ secret: 'secret_key', cookie :{ path: '/', httpOnly: true, maxAge: 30*24*60*60*1000} });
答案 3 :(得分:0)
有点晚了,但我认为这个答案可以帮助人们前进......
我正在使用 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);
});
答案 4 :(得分:0)
这也很晚,但可能对其他人有所帮助。
在我看来,保留会话数据的最佳方法是将其存储在像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();
然后,您只需使用设置为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地址和端口上获得所有相关的会话数据。
答案 5 :(得分:-1)
Yummy似乎允许在创建后修改cookie到期。