Express框架-会话持久化

2017-04-09  本文已影响0人  mr_mshao

在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

上一篇下一篇

猜你喜欢

热点阅读