详解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读取memcache示例分享
Jan 02 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
Nodejs全局安装和本地安装的不同之处
Jul 04 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 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 判断常量,变量和函数是否存在
2009/04/26 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
高考考python编程是真的吗
2020/07/20 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
学年末自我鉴定
2014/01/21 职场文书
项目建议书怎么写
2014/05/15 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
财务管理制度范本
2015/08/04 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL
Python函数中apply、map、applymap的区别
2021/11/27 Python