详解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 25 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
nodejs中的异步编程知识点详解
Jan 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
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
JavaScript 事件系统
2010/07/22 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
js字符串转成JSON
2013/11/07 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
python切换hosts文件代码示例
2013/12/31 Python
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python常用小技巧总结
2015/06/01 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
flask应用部署到服务器的方法
2019/07/12 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python调用支付宝支付接口流程
2019/08/15 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
Python 使用office365邮箱的示例
2020/10/29 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
《画风》教学反思
2014/04/16 职场文书
车辆工程专业求职信
2014/04/28 职场文书
教育见习报告范文
2014/11/03 职场文书
2015教师年度考核评语
2015/03/25 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android