控制会话以express和连接中间件开始
有一种方法来控制会话何时开始连接的会话中间件?
例如,如果我有快速应用程序configuration:
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,则启动一个会话。 如果我只想在用户通过身份validation时才开始会话,该怎么办?
例如,说我有两个路线/protected
和/login
。
- 如果有人点击
/protected
没有会话cookie,中间件将不会启动一个新的会话。 (req.session
为null
) - 如果有人点击
/protected
会话cookie,中间件将检查 cookie是否存在匹配的活动会话并设置req.session
,但不会启动新的会话。 (req.session
可以有一个值或为null
) - 如果有人用正确的参数点击
/login
,则显式启动一个会话,然后只设置一个cookie。
开始会议的唯一方法应该是明确的:
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 } }); }
现有的连接会话中间件有没有办法实现这一点?
你想要做的是删除这一行:
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) { ... });
即使每次开始一个会话,它也没有关系,因为它是空的。 如果您试图使用它来validation访问(这似乎是这种情况),最简单的解决scheme是在您的会话中设置一个属性(如req.session.authenticated = true;),并检查。 这种方式技术上来说,访问者有一个会话,但是只有当req.session.authenticated == true时才会使用会话。 这可能不是你正在寻找的东西,但它是完成这个任务的最简单的方法。