session:数据库存储session

    session数据都是存储在内存当中,当进程退出后,session数据就会丢失。在线上应用上,,用户绝对是不能忍受的,所以要将session数据持久化存储。


    1.如何吧session存储到mongodb数据库当中:

    使用mongodb存储时首先要加载一个模块:connect-mongo

    安装命令:npm install connerct-mongo

    使用代码:

      var session = require('express-session');
         var MongoStore = require('connect-mongo')(session);
    
         mongoose.connect('mongodb://');//连接数据库
    
         mongoose.connection.on('open',function() {
            console.log('---数据库连接成功!---');
         })
    
         app.use(session({
            secret:config.cookieSecret,//secret的值建议使用128个随机字符串
            cookie:{maxAge:60*1000*60*24*14},//过期时间
            resave:true,//即使session没有被修改,也保存session值,默认为true
            saveUninitialized:true,
            store:new mongoStore({
                mongooseConnection:mongoose.connection//使用已有的数据库连接
            });
         }));
    
         app.listen(80);


    2.如何把session存储到redis数据库

    Redis是一个非常适合用于session管理的数据库。第一,它的结构简单,key-value的形式非常符合SessionID-UserID的存储;第二,读写速度非常快;第三,自身支持数据自动过期和清除;第四,语法、部署非常简单。


    需要两个中间件:

    • express-session

    • connect-redis

    参数:

    • client 你可以复用现有的redis客户端对象, 由 redis.createClient() 创建

    • host   Redis服务器名

    • port   Redis服务器端口

    • socket Redis服务器的unix_socket

    可选参数:

    • ttl        Redis session TTL 过期时间 (秒)

    • disableTTL 禁用设置的 TTL

    • db         使用第几个数据库

    • pass       Redis数据库的密码

    • prefix     数据表前辍即schema, 默认为 "sess:"


    代码示例:

      var express = require('express');
         var session = require('express-session');
         var RedisStore = require('connect-redis')(session);
         var app = express();
         var options = {    
             "host": "127.0.0.1",
             "port": "6379", 
             "ttl": 60 * 60 * 24 * 30,//session的有效期为30天(秒)
         }; 
         
         // 此时req对象还没有session这个属性
         app.use(session({    
             store: new RedisStore(options),    
             secret: 'express is powerful'
         })); 
         app.listen(80);




    session的生命周期:

      由于session是存在服务器端数据库的,所以的它的生命周期可以持久化,而不仅限于浏览器关闭的时间。具体是由cookie.maxAge 决定:如果maxAge设定是1个小时,那么从这个因浏览器访问服务器导致session创建开始后,session会一直保存在服务器端,即使浏览器关 闭,session也会继续存在。如果此时服务器宕机,只要开机后数据库没发生不可逆转的破坏,maxAge时间没过期,那么session是可以继续保 持的。

      当maxAge时间过期后,session会自动的数据库中移除,对应的还有浏览器的cookie。不过,由于connect-mongo的特殊机制(每1分钟检查一次过期session),session的移除可能在时间上会有一定的滞后


    当然,由于cookie是由浏览器厂商实现的,cookie不具有跨浏览器的特性,例如,我用firefox浏览器在京东上购物时,勾选了2周内免密码输 入,但是当我第一次用IE登陆京东时,同样要重新输入密码。所以,这对服务器的同一个操作,不同的浏览器发起的请求,会产生不同的session- cookie。