aliez-session
Version:
aliez session midware
97 lines (83 loc) • 1.9 kB
JavaScript
;
var qc = require('qcrypto'), qs = require('querystring');
// 有效时长,30分钟
var MAX_TIMEOUT = 30 * 60 * 1000;
var ssdb = {
// session数据
db : {},
// 设置session
set : function(){
var id, data;
if(arguments.length == 2){
id = arguments[0];
data = arguments[1];
}else if(arguments.length == 1){
id = ssdb.genID();
data = arguments[0];
}else{
return false;
}
ssdb.db[id] = {
time: Date.now(),
data: data
};
return id;
},
// 获取
get : function(id){
if('string' == typeof id){
return ssdb.db[id] ? ssdb.db[id].data : void(0);
}else{
return false;
}
return false;
},
// 更新时间
update : function(id){
if('string' == typeof id){
if(ssdb.db[id]){
ssdb.db[id].time = Date.now();
}
}else{
return false;
}
return this;
},
// 生成ID
genID : function(ip){
ip = 'string' == typeof ip ? ip : (Math.Random() * 10000).toString();
var str = ip + Date.now() + Math.floor(Math.random() * 100000);
return qc.sha1(str);
}
};
// 每分钟检测超时的session,删除超时的session
setInterval(function(){
var now = Date.now();
for(var id in ssdb.db){
if(MAX_TIMEOUT < now - ssdb.db[id].time){
delete ssdb.db[id];
}
}
}, 60000);
var session = function(req, res, done){
var id, obj, session;
if(req.headers['cookie']){
obj = qs.parse(req.headers['cookie']);
if(obj.ASID){
id = obj.ASID;
session = ssdb.get(id);
if(session){
req.session = session;
ssdb.update(id);console.log(session);
}
}
}
res.session = function(data){
id = id ? id : ssdb.genID(req.socket.remoteAddress);
ssdb.set(id, data);
res.setHeader('Set-Cookie', ['ASID=' + id + ';path=/;httponly']);
req.session = data;
};
done();
};
module.exports = session;