详解nodejs express下使用redis管理session


Posted in NodeJs onApril 24, 2017

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实例化后调用代码(https://github.com/expressjs/session)

if (!req.sessionID) {

  debug('no SID sent, generating session');

  generate();

  next();

  return;

 }

generate方法调用(https://github.com/expressjs/session)

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)(https://github.com/expressjs/session)

store.set调用RedisStore.prototype.set(https://github.com/tj/connect-redis),其中座位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方法

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

NodeJs 相关文章推荐
NodeJS与Mysql的交互示例代码
Aug 18 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 #NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 #NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 #NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 #NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 #NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 #NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 #NodeJs
You might like
Oracle 常见问题解答
2006/10/09 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php中引用符号(&)的使用详解
2013/11/13 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php检测文本的编码
2015/07/26 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
js中url对象化管理分析
2017/12/29 Javascript
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
python实现在windows下操作word的方法
2015/04/28 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
在线课程:Skillshare
2019/04/02 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
路政管理专业个人自荐信范文
2013/11/30 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server