详解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
Nov 08 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
php不用正则采集速度探究总结
2008/03/24 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
Python实现登陆文件验证方法
2018/10/06 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
python函数不定长参数使用方法解析
2019/12/14 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
校友会欢迎辞
2014/01/13 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
公司门卫工作职责
2014/06/28 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
新学期主题班会
2015/08/17 职场文书