详解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(二)--- Node.js事件模块
May 21 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
分享五个Node.js开发的优秀实践 
Apr 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截取中文字符串的问题
2006/07/12 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
js判断undefined变量类型使用typeof
2013/06/03 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
JS原型链怎么理解
2016/06/27 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
VsCode里的Vue模板的实现
2020/08/12 Javascript
python实现的登录和操作开心网脚本分享
2014/07/09 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
pandas 时间格式转换的实现
2019/07/06 Python
django用户登录验证的完整示例代码
2019/07/21 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
土建资料员岗位职责
2014/01/04 职场文书
《长城》教学反思
2014/02/14 职场文书
森林病虫害防治方案
2014/06/02 职场文书
小学语文教师研修日志
2015/11/13 职场文书
Django显示可视化图表的实践
2021/05/10 Python
canvas绘制折线路径动画实现
2021/05/12 Javascript
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers