美文网首页
Express框架-会话持久化

Express框架-会话持久化

作者: mr_mshao | 来源:发表于2017-04-09 17:01 被阅读0次

    在express4.0之前的版本,像session,cookieParser之类的中间件是伴随express自动安装的,4.0之后的需要另行安装express-session模块。用的时候不再使用express.session(),而是直接使用session()。

    connect-mongo 模块

    把会话信息存储在数据库中,便于持久维护。为了使用这一功能,需要获得一个叫做 connect-mongo 的模块

    npm install connect-mongo --save

    Express 4.0之前

    session存储在内存中

    var express = require('express');

    var session = require('express-session');

    var cookieParser = require('cookie-parser');

    var app = express()

    app.use(express.bodyParser())

    app.use(express.cookiePaeser())

    app.use(express.session({

    secret: '12345',

    name: 'testapp',  //这里的name值得是cookie的name,默认cookie的name是:connect.sid

    cookie: {maxAge: 80000 },  //设置maxAge是80000ms,即80s后session和相应的cookie失效过期

    resave: false,

    saveUninitialized: true,

    }))

    app.get('/',function(req,res){

    if(req.session.name) {

    console.log('your name is : ' + req.session.name + "!");

    }

    //每一次访问时,session对象的name会自动的保存或更新内存中的session中去。

    req.session.name = '张三';

    res.send("You're 张三. And the session expired time is: " + req.session.cookie.maxAge);

    })

    session的生命周期

    session与发送到客户端浏览器的生命周期是一致的。而我们在挂载session的时候,通过option选项的cookie.maxAge成员,可以设置session的过期时间,以ms为单位(但是,如果session存储在mongodb中的话,任何低于60s(60000ms)的设置是没有用的)。如果maxAge不设置,默认为null,这样的expire的时间就是浏览器的关闭时间,即每次关闭浏览器的时候,session都会失效。

    具体参见https://www.npmjs.com/package/express-session

    session存储在数据库中

    var express = require('express');

    var session = require('express-session');

    var cookieParser = require('cookie-parser');

    var MongoStore = require('connect-mongo')(session);//session存储到数据库中

    var app = express()

    app.use(express.bodyParser())

    app.use(express.cookiePaeser())

    app.use(session({

    secret: '12345',

    name: 'testapp',

    cookie: {maxAge: 80000 },

    resave: false,

    saveUninitialized: true,

    store: new MongoStore({  //创建新的mongodb数据库

    host: 'localhost',    //数据库的地址,本机的话就是127.0.0.1,也可以是网络主机

    port: 27017,          //数据库的端口号

    db: 'test-app'        //数据库的名称。

    })

    }))

    app.get('/',function(req,res){

    if(req.session.name) {

    console.log('your name is : ' + req.session.name + "!");

    }

    //每一次访问时,session对象的name会自动的保存或更新内存中的session中去。

    req.session.name = '张三';

    res.send("You're 张三. And the session expired time is: " + req.session.cookie.maxAge);

    })

    跟session的内存存储一样,只需增加store选项即可,app会自动替我们把session存入到mongodb数据,而非内存中。

    session的生命周期:

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

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

    Express 4.0及以后的版本

    4.0之后的需要另行安装express-session模块。用的时候不再使用express.session(),而是直接使用session()。

    同样的还有cookieParser,bodyParser,favicon

    更多内容https://github.com/visionmedia/express/wiki/Migrating%20from%203.x%20to%204.x

    基本类似,无太多区别

    npm install express-session --save

    var session = require('express-session');

    var MongoStore = require('connect-mongo')(session);

    var dburl='mongodb://localhost/imooc'

    app.use(session({

    secret: '12345',

    store: new MongoStore({

    url : dburl,//数据库地址

    collection : 'sessions'

    })

    }));

    原文参考:https://segmentfault.com/a/1190000002812451

    相关文章

      网友评论

          本文标题:Express框架-会话持久化

          本文链接:https://www.haomeiwen.com/subject/bwwdattx.html