详解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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
nodejs教程之异步I/O
Nov 21 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 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
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python中的格式化输出用法总结
2016/07/28 Python
深入理解Python中的super()方法
2017/11/20 Python
python 中字典嵌套列表的方法
2018/07/03 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python opencv实现图像边缘检测
2019/04/29 Python
Django REST framework 分页的实现代码
2019/06/19 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
学校花圃的标语
2014/06/18 职场文书
社团活动总结书
2014/06/27 职场文书
销售经理工作检讨书
2015/02/19 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript