在虚构的Session模块中,_sessData
变量可以在请求之间泄露。例如,可能是刚登录的用户,并且在“同一时间”调用的isAuthed()是针对不同的用户。这可能是个问题吗?每个请求都会调用此模块,所以我猜它是安全的,但确认会很好。
module.exports = function(app) {
var _sessData = null;
function Session() {
//
}
Session.prototype.set = function( payload ) {
Cookies.set('session', payload);
_sessData = payload;
}
Session.prototype.isAuthed = function() {
return _sessData && Object.keys(_sessData).length > 0;
}
Session.prototype.clear = function() {
Cookies.set('session', '');
_sessData = {};
}
Object.defineProperty(app.context, 'Session', {
// Not exaclty sure what is happening here with this and _ctx..
// Note: apprently ctx is bound to the middleware when call()ing
get: function() { return new Session(this); }
});
return function * (next) {
var token = Cookies.get('jwt');
if ( ! token ) {
_sessData = {};
return yield* next;
}
try {
_sessData = jwt.verify(token, SECRET);
} catch(e) {
if (e.name === 'TokenExpiredError') {
this.Session.clear();
}
}
yield* next;
}
}
修改
该模块在KoaJS应用程序中得到了如此使用(上面的模块没有生成合适的KoaJS中间件,但这不是重点):
var app = require('koa')();
// JWT session middleware
var session = require("./session")();
app.use(session);
app.listen(3080);
答案 0 :(得分:0)
导出的内容是一个函数,因此导入模块时实际上不存在_sessData
。它在您调用函数时创建。每次调用该函数时 - 每个请求都需要调用一次 - 创建一个名为_sessData
的范围内的新变量。不,他们不能互相干扰。