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。
