Node.js 从express和connect中间件开始控制会话
有没有一种方法可以通过connect的会话中间件控制会话何时启动 例如,如果我有express app config:Node.js 从express和connect中间件开始控制会话,node.js,session,express,connect,Node.js,Session,Express,Connect,有没有一种方法可以通过connect的会话中间件控制会话何时启动 例如,如果我有express app config: var app = express(); app.configure(function(){ app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('secret')); app.use(express.session({ st
var app = express();
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('secret'));
app.use(express.session({ store:sessionStore, ... }));
});
然后在每个请求上,如果没有给出会话cookie,则启动会话。如果我只想在用户经过身份验证后启动会话,该怎么办
例如,假设我有两条路由/protected
和/login
- 如果有人在没有会话cookie的情况下点击
,中间件将不会启动新会话。(/protected
为req.session
)null
- 如果有人使用会话cookie点击
,中间件将检查是否有与cookie匹配的活动会话,并设置/protected
,但不会启动新会话。(请求会话
可以有值,也可以是req.session
)null
- 如果有人使用正确的参数点击了
,则会显式启动会话,,然后才设置cookie/login
app.post('/login', function(req, res, next) {
// connect to database and validate user...
db.authenticate( req.body.user, req.body.pass, function(allow) {
if (allow) {
// START SESSION HERE
// this will send set the cookie
}
});
}
使用现有的连接会话中间件有什么方法可以实现这一点吗?即使每次都启动一个会话,也不重要,因为它将是空的。如果您试图使用它来验证访问权限(似乎就是这种情况),最简单的解决方案是在会话中设置一个属性(例如req.session.authenticated=true;),并进行检查。从技术上讲,任何访问者都有一个会话,但是只有当req.session.authenticated==true时,您才会使用该会话。这可能不是您想要的,但这是完成此操作的最简单方法。您要做的是删除此行:
app.use(express.session({ store:sessionStore, ... }))
现在会话在默认情况下被禁用,由您决定使用哪个控制器:
var useSessions = express.session({ store:sessionStore, ... });
var preCb = function (req, res, next) {
// authenticate and stuff
// ....
if (authenticated === true) {
next();
}
};
app.post('/login', useSessions, function(req, res, next) { ... });
app.post('/protected', preCb, useSessions, function(req, res, next) { ... });
如果您使用的是后台数据库会话存储,那么每个匿名用户都将创建存储在数据库中的会话。我确实理解这一点,但无论如何,您不应该永远保留会话数据。当会话数据过期时,应该将其删除,如果匿名用户只访问您站点上的几个页面,则应该在他们离开后很快将其删除。此外,匿名用户的会话本质上是空对象(如果我错了,请纠正我),因此不应该是一个巨大的内存负担。会话中间件的工作方式是,它将为每个没有会话的用户创建一个会话(没有cookie)。这意味着对于每个不发送cookie的请求,数据库都会有一个条目。在我正在使用的系统中,这是不可接受的。如果您将会话信息存储在数据库中,而没有清除过期信息,我可以看出这将是一个问题。您可以尝试(我不确定这是否可行)创建自己的中间件,用于检查会话cookie。如果存在,则使用app.use(express.session(..),否则只需调用next()。我不确定这是否有效,但这只是一个想法。在这里看一下创建中间件:是的,我想我将实现自己的中间件来处理它。在我看来,这似乎是一个缺乏的特点。