详解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和php实现图片访问实时处理
Jan 05 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
Javascript之String对象详解
2016/06/08 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
python使用marshal模块序列化实例
2014/09/25 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python探索之Metaclass初步了解
2017/10/28 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
美国NBA官方商店:NBA Store
2019/04/12 全球购物
管道维修工岗位职责
2013/12/27 职场文书
继电保护工岗位职责
2014/01/05 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
小学生开学感言
2014/02/28 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
学校四风对照检查材料
2014/08/28 职场文书
验房委托书
2014/08/30 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
python基础学习之递归函数知识总结
2021/05/26 Python
vue+element ui实现锚点定位
2021/06/29 Vue.js
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis