如何从Redis中保存和检索会话

50

我正在尝试将Redis会话集成到我用Node.js编写的身份验证系统中。

我已成功设置了Redis服务器、connect-redis和Express服务器。

以下是我的设置(仅列出重要部分):

var express = require("express");
var RedisStore = require("connect-redis")(express);
var redis = require("redis").createClient();

app.use(express.cookieParser());
app.use(express.session({
    secret: "thisismysecretkey",
    store: new RedisStore({ host: 'localhost', port: 6379, client: redis })
}));

现在...我该如何创建、读取和销毁会话?我知道这可能非常简单。我已经阅读了大量关于如何设置connect-redis的文章以及许多在SO上的问题,但是我发誓每个人都只停留在配置方面,而没有解释如何实际使用它...

3个回答

31

以上应该就是全部内容了。您可以通过 req.session 访问路由处理程序中的会话。会话将自动创建、保存和销毁。

如果您需要手动为用户创建一个新会话,请调用 req.session.regenerate()

如果您需要手动保存它,可以调用 req.session.save()

如果您需要手动销毁它,可以调用 req.session.destroy()

有关方法和属性的完整列表,请参见Connect文档


11
考虑以下代码。
var express = require('express');
var redis   = require("redis");
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var client  = redis.createClient();
var app = express();

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

app.get('/',function(req,res){  
    // create new session object.
    if(req.session.key) {
        // if email key is sent redirect.
        res.redirect('/admin');
    } else {
        // else go to home page.
        res.render('index.html');
    }
});

app.post('/login',function(req,res){
    // when user login set the key to redis.
    req.session.key=req.body.email;
    res.end('done');
});

app.get('/logout',function(req,res){
    req.session.destroy(function(err){
        if(err){
            console.log(err);
        } else {
            res.redirect('/');
        }
    });
});

app.listen(3000,function(){
    console.log("App Started on PORT 3000");
});

所以您需要安装connect-redis并将您的express-session实例传递给它。

然后在中间件中按照以下方式使用服务器详细信息来初始化redisStore。

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
})); 

我将TTL设置为260,你可以增加这个数值。在TTL达到极限后,Redis键将自动被删除。

在路由器中,你可以使用req.session变量来设置、编辑或删除会话。

还有一件事……

如果你想要自定义cookie,即与Redis存储中的cookie不同,你可以使用cookie-parser 来设置cookie secrets。

希望这会有所帮助。

链接:https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/


为什么我总是看到“创建新的会话对象”被注释掉?这是指运行req.session.regenerate()吗?您能澄清一下吗? - Joseph K.

0
你还可以使用Redis监视器工具实时查看所有操作!当您刷新应用程序时,您将在控制台窗口中看到数据出现。
redis-cli monitor

tj/connect-redis 使用会话的示例输出

1538704759.924701 [0 unix:/tmp/redis.sock] "expire" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh" "3600"
1538704759.131285 [0 unix:/tmp/redis.sock] "get" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"

如何在Express中访问它?我想列出所有活动会话,并根据需要手动删除用户会话。 - tarun jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接