详解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及配置app.js文件的详细步骤
May 11 NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
nodejs基础知识
Feb 03 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 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 cookie 登录验证示例代码
2009/03/16 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
探讨如何把session存入数据库
2013/06/07 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python实现计算资源图标crc值的方法
2014/10/05 Python
Python中操作MySQL入门实例
2015/02/08 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
python定时任务 sched模块用法实例
2019/11/04 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
茶叶生产计划书
2014/01/10 职场文书
小加工厂管理制度
2014/01/21 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
2014年妇联工作总结
2014/11/21 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫