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 express下使用redis管理session的更多相关文章

  1. nodejs 使用redis 管理session

    一.在开发机安装redis并远程连接 因本人的远程开发机配置原因,使用jumbo安装redis 首先登录开发机,并使用jumbo 安装redis:jumbo install redis 查看redis ...

  2. linux下实现redis共享session的tomcat集群

    为了实现主域名与子域名的下不同的产品间一次登录,到处访问的效果,因此采用rediss实现tomcat的集群效果.基于redis能够异步讲缓存内容固化到磁盘上,从而当服务器意外重启后,仍然能够让sess ...

  3. 用Redis管理Session

    maven <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</ar ...

  4. 集群下使用redis统一session处理

    pom依赖(快照版): <dependency> <groupId>org.springframework.session</groupId> <artifa ...

  5. NodeJS+Express下构建后端MVC文件结构

    关于MVC的结构大体上有两种方式,其一按照层级进行文件夹分类,其二是按照业务进行文件夹分类.关于这个demo相关的业务简单,所以暂采用第一种的方式,当然实际当中很恨复杂的项目可以采用两种方式相结合的方 ...

  6. Nodejs Express下引入本地文件的方法

    Express的结构如下: |---node_modules------用于安装本地模块.     |---public------------用于存放用户可以下载到的文件,比如图片.脚本文件.样式表 ...

  7. ASP.NET下跨应用共享Session和使用Redis进行Session托管简介

    在之前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种情况下Session的处理.在ASP.NET提供的Session处理方法中,有以下四种模式: 1. ...

  8. ASP.NET下跨应用共享Session和使用Redis进行Session托管

    在之前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种情况下Session的处理.在ASP.NET提供的Session处理方法中,有以下四种模式: 1. ...

  9. Redis托管Session

    一:redis托管session主要是为了不同域之间共享session.Asp.net提供了四种处理Session的方法 1.  InProc模式 这是ASP.NET默认的Session管理模式,在应 ...

随机推荐

  1. 又见SpringMVC

    一.如何让一个普通类成为Controller? 方案一:实现接口Controller解析:handleRequest(request,response) 方案二:继承AbstractControlle ...

  2. Warning: strftime(): It is not safe to rely on the system's timezone settings.

    当运行程序时,会出现如下警告: Warning: strftime(): It is not safe to rely on the system's timezone settings. You a ...

  3. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005

    检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005 在CSDN上总是有网友问这个 ...

  4. [LeetCode] Best Time to Buy and Sell Stock II 买股票的最佳时间之二

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  5. [LeetCode] Count and Say 计数和读法

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  6. js封装的三级联动菜单(使用时只需要一行js代码)

    前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...

  7. 使用css3做钟表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. MyBatis中collection (一对一,一对多)

    MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...

  9. Appium环境搭建+cordova

    1.安装JDK 配置JAVA_HOME(变量值为jdk的安装目录)以及Path path值如下: 验证是否生效 2.安装node.js 选择适合自己的版本官网直接下载https://nodejs.or ...

  10. 封装一个函数获取匹配特定的css选择符

    function $$(selector,context){ context=context||document; var elements=context.querySelectorAll(sele ...