在部分路由上激活 Express.js 会话

问题描述 投票:0回答:1

我正在使用expressjs,并希望使用会话对用户登录进行身份验证。站点/应用程序一方面应允许用户在无状态网页中浏览和调查不同的产品和信息,从而允许缓存这些页面,但另一方面应具有让用户登录和访问使用会话获取的不同内容的功能.

因此,对于我的路由子集,我希望激活会话状态,而对于补充子集(我的路由的其余部分),应停用快速会话,从而允许缓存这些页面。

我怎样才能以干净的方式做到这一点?

假设我要激活会话的路由是“/kj%C3%B8p”、“/bibliotek”和“/register”。

我尝试过类似的事情

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');

  var pageName = 'somepage';
  var oneYear = 1000*60*60*24*365;
  app.use(express.bodyParser());
  app.use('/kj%C3%B8p', express.cookieParser());
  app.use('/kj%C3%B8p', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path:'/', maxAge: (5*oneYear), httpOnly: true}}));
  app.use('/bibliotek', express.cookieParser());
  app.use('/bibliotek', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path: '/', maxAge: (5*oneYear), httpOnly: true}}));
  app.use('/registrer', express.cookieParser());
  app.use('/registrer', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path:'/', maxAge: (5*oneYear), httpOnly: true}}));

  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));

});

但这会为三个路由中的每一个重新生成会话对象,并且看起来很混乱。有什么建议吗?

express session routes node.js-connect
1个回答
5
投票

您可以将中间件包装在函数中以将某些网址列入黑名单或白名单。这是一个白名单示例:

function allow(paths, fn) {
  return function(req, res, next) {
    if (~paths.indexOf(req.url)) {
      return fn(req, res, next);
    }
    next();
  }
}

您将其包裹在中间件中,例如:

app.use(allow(['/bibliotek', '/registrer'], express.cookieParser()));

您也可以对其他中间件使用相同的技术。这是基于表达作者在 irc 中展示的要点

© www.soinside.com 2019 - 2024. All rights reserved.