详解nodejs express下使用redis管理session
程序员文章站
2023-10-26 17:37:28
session实现原理
实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的session id结合浏览器的cookie实现对session的管理,一般...
session实现原理
实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的session id结合浏览器的cookie实现对session的管理,一般来说包括以下4个步骤:
1.服务器端的产生session id
2.服务器端和客户端存储session id
3.从http header中提取session id
4.根据session id从服务器端的hash中获取请求者身份信息
使用express和redis对session管理的实现
var session = require('express-session'); var redisstrore = require('connect-redis')(session); var config={ "cookie" : { "maxage" : 1800000 }, "sessionstore" : { "host" : "192.168.0.13", "port" : "6379", "pass" : "123456", "db" : 1, "ttl" : 1800, "logerrors" : true } app.use(session({ name : "sid", secret : 'asecret123-', resave : true, rolling:true, saveuninitialized : false, cookie : config.cookie, store : new redisstrore(config.sessionstore) }));
实现堆栈
express-session实例化后调用代码()
if (!req.sessionid) { debug('no sid sent, generating session'); generate(); next(); return; }
generate方法调用()
store.generate = function(req){ req.sessionid = generateid(req); req.session = new session(req); req.session.cookie = new cookie(cookieoptions); if (cookieoptions.secure === 'auto') { req.session.cookie.secure = issecure(req, trustproxy); } };
redisstrore实例化时调用store.set(sid, session, callback)()
store.set调用redisstore.prototype.set(),其中座位hashkey使用的是前缀+sessonid,前缀默认值为'sess',多个应用共享和不共享同一个redis session服务时,一定要注意设置prefix
redisstore.prototype.set = function (sid, sess, fn) { var store = this; var args = [store.prefix + sid]; if (!fn) fn = noop; try { var jsess = store.serializer.stringify(sess); } catch (er) { return fn(er); } args.push(jsess); if (!store.disablettl) { var ttl = getttl(store, sess); args.push('ex', ttl); debug('set "%s" %s ttl:%s', sid, jsess, ttl); } else { debug('set "%s" %s', sid, jsess); } store.client.set(args, function (er) { if (er) return fn(er); debug('set complete'); fn.apply(null, arguments); }); };
store.client.set调用的为(https://github.com/noderedis/node_redis)
最终调用原生redis.hset方法
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。