Как сохранить и получить сеанс из Redis
Я пытаюсь интегрировать сеансы Redis в мою систему аутентификации, написанную в Node.js.
Мне удалось успешно настроить сервер Redis, connect-redis
и Express server.
Вот моя настройка (только важный бит):
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, но я клянусь, что каждый останавливается только на конфигурации и не объясняет, как на самом деле использовать его...
Я знаю, что это, наверное, очень просто, но, пожалуйста, не занимитесь и просто объясните:).
Ответы
Ответ 1
Это должно быть все, что нужно. Вы получаете доступ к сеансу в обработчиках маршрута через req.session
. Сеансы создаются, сохраняются и уничтожаются автоматически.
Если вам нужно вручную создать новый сеанс для пользователя, вызовите req.session.regenerate()
.
Если вам нужно сохранить его вручную, вы можете вызвать req.session.save()
.
Если вам нужно уничтожить его вручную, вы можете вызвать req.session.destroy()
.
См. документацию Connect для получения полного списка методов и свойств.
Ответ 2
Рассмотрим этот код.
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 для SET, EDIT или DESTROY сеанса.
Еще одна вещь...
Если вы хотите, чтобы пользовательский cookie i.e не был таким же, как в вашем магазине Redis, вы можете использовать cookie-parser, чтобы установить секреты cookie.
Надеюсь, что это поможет.
ссылка: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/