Javascript Node/commonJS可以在请求之间“私有”变量泄漏
在下面一个虚构的会话模块中,_sessData变量可能在请求之间泄漏。例如,可能有一个用户刚刚登录,同时为另一个用户进行了isAuthed调用。这可能是个问题吗?每个请求都会调用这个模块,所以我想这是安全的,但是确认一下就好了Javascript Node/commonJS可以在请求之间“私有”变量泄漏,javascript,node.js,commonjs,koa,Javascript,Node.js,Commonjs,Koa,在下面一个虚构的会话模块中,_sessData变量可能在请求之间泄漏。例如,可能有一个用户刚刚登录,同时为另一个用户进行了isAuthed调用。这可能是个问题吗?每个请求都会调用这个模块,所以我想这是安全的,但是确认一下就好了 module.exports = function(app) { var _sessData = null; function Session() { // } Session.prototype.set = funct
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);
您正在导出的是一个函数,因此在导入模块时,数据实际上并不存在。它在调用函数时创建。每次调用函数时(每个请求需要调用一次),都会在该范围内创建一个名为_sessData的新变量。不,它们不能相互干扰。对于每个单独的用户/请求,您如何调用它?@jfriend00实际的实现是在KoaJS中间件中进行的。所以它被用来查看应用程序。使用。。从引导文件中,根本无法解释它。是为每个新请求单独调用此模块,以便为每个请求创建一个新会话对象,还是所有请求只使用一个会话对象。@jfriend00我想这是模糊的部分。我已经用一些上下文更新了这个问题,关于如何调用这个模块。这更有意义吗?那代码看起来不太管用。var session=require./session;表示会话将是会话对象的实例。因此,使用app.usesession,您将一个会话对象传递给app.use,而不保存创建新会话对象的函数,这让我认为每个请求都有一个会话对象,这是一个严重的问题。