详解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开发微信公众号后台服务实例
Sep 03 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
浅谈Node的内存泄露问题
May 06 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
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
学习php开源项目的源码指南
2014/12/21 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
JS日历 推荐
2006/12/03 Javascript
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
用js编写留言板
2020/03/17 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
python文件写入write()的操作
2019/05/14 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
企业申诉管理制度
2014/01/30 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
软件项目实施计划书
2014/05/02 职场文书
心理咨询承诺书
2014/05/20 职场文书
师范生见习报告
2014/10/31 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
红色革命电影观后感
2015/06/18 职场文书
公司董事任命书
2015/09/21 职场文书
美元符号 $
2022/02/17 杂记