session插件开发
上一节的分析,我们了解了cookie和session的关系。接下来,将实际的开发session插件,以下是session插件源代码。
var sid = Date.now() , cache = {}
module.exports = function(req,res,next){
Object.defineProperty(req,"session",{
get: function(){
return cache[this.sessionId];
},
set: function(value){
cache[this.sessionId] = value;
}
})
if(!(req.headers.cookie && (req.sessionId = parse(req.headers.cookie).sessionId))){
req.sessionId = sid += 1;
res.setHeader("Set-Cookie",["sessionId="+req.sessionId])
}
next();
}
// 把cookie字符串转换为json对象
function parse(str){
var arr = str.split(";")
,obj = {}
arr.forEach(function(field){
var o = field.split("=");
obj[o[0].trim()] = o[1];
})
return obj;
}sid是一个生成ID的时间阀,每次需要生成性的sessionId时候会 +1 , cache是保存session id对应的数据,这个数据用户可通过req.session = xxx 自定义,也可通过req.session进行访问。parse方法是用来把cookie的字符串形式转换为json对象。
通过 if(!(req.headers.cookie && (req.sessionId = parse(req.headers.cookie).sessionId)))判断req.sessionId是否存在,如果不存在那么就创建一个并把sessionId信息写入到响应头发送给客户端。
最后,还要在index.js文件中加入:
exports.session = require("./lib/session");有了session插件后,明天开发博客系统就有了保证,因为登录状态需要记录在session里。下一节,我们用session插件,做一个数字累加的例子。