详解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 相关文章推荐
使用forever管理nodejs应用教程
Jun 03 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
nodejs加密Crypto的实例代码
Jul 07 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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的ASP防火墙
2006/10/09 PHP
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
Js的MessageBox
2006/12/03 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
js取得url地址参数实例
2013/02/22 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
如何基于Python批量下载音乐
2019/11/11 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
python的json包位置及用法总结
2020/06/21 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
上班上网检讨书
2014/01/29 职场文书
12岁生日演讲稿
2014/05/14 职场文书
小学班级口号
2014/06/09 职场文书