详解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框架Express的模板视图机制分析
Jul 19 NodeJs
用nodejs访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
详解nodejs内置模块
May 06 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连mysql和oracle数据库性能比较
2006/10/09 PHP
PHP 彩色文字实现代码
2009/06/29 PHP
php伪静态之APACHE篇
2014/06/02 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
python进阶教程之动态类型详解
2014/08/30 Python
python实现键盘控制鼠标移动
2020/11/27 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
浅析matlab中imadjust函数
2020/02/27 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
Ibatis如何使用动态表名
2015/07/12 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
经济管理专业毕业生推荐信
2013/11/11 职场文书
自荐信范文
2013/12/10 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
联谊会主持词
2014/03/26 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
python中取整数的几种方法
2021/11/07 Python
Redis数据同步之redis shake的实现方法
2022/04/21 Redis
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle