欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解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方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。