详解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
NodeJs基本语法和类型
Feb 13 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
深入理解Nodejs Global 模块
Jun 03 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
PHP安全下载文件的方法
2016/04/07 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
jquery实现心算练习代码
2010/12/06 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
python操作xml文件详细介绍
2014/06/09 Python
python 实现dict转json并保存文件
2019/12/05 Python
python实现斗地主分牌洗牌
2020/06/22 Python
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
初一地理教学反思
2014/01/16 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python