【问题标题】:how to manage multiple session in express js如何在express js中管理多个会话
【发布时间】:2017-10-05 20:00:13
【问题描述】:

我正在构建一个站点,因为两个 url ('/','/admin') 会话发生冲突 这是我的 app.js 会话代码

  app.use(logger('dev'));
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));
  app.use(cookieParser());
  app.use(session({
      secret: "JHGF>,./?;;LJ8#$?,KL:>>>,,KJJJDHE",
      resave: true,
      saveUninitialized: true
  }));
  app.use(flash());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(express.static(path.join(__dirname, 'public')));

  app.use('/', index);
  app.use('/admin', admin);

请问我该如何解决这个问题?

这里是 index.js

   var express = require('express');

    var User = require('../models/user');
    var Admin = require('../models/admin');
     var Pandingpay = require('../models/pandingpay');
     var Confirmpay = require('../models/confirmpay');
    var passport = require('passport');
   var moment = require('moment');

   var router = express.Router();


  function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) {
    next();
  } else {
     req.flash("info", "You must be logged in to see this page.");
     res.redirect("/user/login");
   }
  };
    function Authenticated(req, res, next) {
   if (req.isAuthenticated()) {
      res.redirect('/user/dashboard/');
   }else {
    next();
    }
  };

    router.use(function(req, res, next){
      res.locals.currentUser = req.user;
      res.locals.errors = req.flash("error");
     res.locals.infos = req.flash("info");
     next();
     });

     /* GET home page. */
     router.get('/', function(req, res) {
     res.render('index',{
           title: 'Home'
      });
     });

   router.post('/login', function(req, res, next) {
        passport.authenticate('user-local', {failureFlash:true}, function(err, user, info) {
       if(!req.body.password || !req.body.username){
      req.flash("error", "Please enter your username and password");
      return res.redirect("/login");
    }
   if (err) { return next(err); }
   if (!user) { 
      req.flash("error", "Sorry  username or password is invalied!");
      return res.redirect('/login'); 
    }
       req.logIn(user, function(err) {
         if (err) { return next(err); }
       return res.redirect('/dashboard');
      });
     })(req, res, next);
     });

这是我的 admin.js

   var express = require('express');

   var User = require('../models/user');
   var Admin = require('../models/admin');
   var Pandingpay = require('../models/pandingpay');
   var Confirmpay = require('../models/confirmpay');
    var passport = require('passport');
   var moment = require('moment');

   var routeradmin = express.Router();


   function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) {
      next();
     } else {
      req.flash("info", "You must be logged in to see this page.");
       res.redirect("/admin/login");
       }
      };



      routeradmin.use(function(req, res, next){
       res.locals.currentUser = req.user;
       res.locals.errors = req.flash("error");
         res.locals.infos = req.flash("info");
        next();
        });

       /* GET home page. */

      routeradmin.get('/login', function(req, res) {
          res.render('adminlogin');
         });


       routeradmin.post('/login', function(req, res, next) {
  passport.authenticate('admin-local', {failureFlash:true}, function(err, user, info) {
   if(!req.body.password || !req.body.username){
      req.flash("error", "Please enter your username and password");
      return res.redirect("/admin/login");
    }
   if (err) { return next(err); }
   if (!user) { 
      req.flash("error", "Sorry  username or password is invalied!");
      return res.redirect('/admin/login'); 
    }
  req.logIn(user, function(err) {
    if (err) { return next(err); }
    return res.redirect('/admin/allusers/' + user.username);
 });
})(req, res, next);
});

我所说的冲突的意思是,当管理员登录而不是为管理员创建新会话时,它使用已登录用户用户的会话

【问题讨论】:

  • “冲突”是什么意思?为了让我们帮助您,我们需要准确了解您观察到的情况,以便我们了解您需要帮助解决什么问题。我们可能还需要知道indexadmin 函数应该做什么并查看它们的代码。通常,像这样的特定路线是app.get('/', index) 而不是app.use(),但这取决于您要对这些路线做什么。需要查看更多代码。需要您描述确切的问题。 “冲突”不是准确的描述。
  • 好的,我现在要更新我的代码
  • 我的代码已更新

标签: express express-session


【解决方案1】:

我认为 Flash 小部件可能位于共享应用程序的某个位置?而不是分成不同的路径?

这样有意义吗

【讨论】:

    【解决方案2】:

    如果您想要两个单独的会话对象,一个用于常规用途,一个用于管理员用途,它们之间没有重叠,那么您必须执行两个单独的 app.use('/path1', session(...))app.use('/path2', session(...)) 语句,这样您就有两个单独的会话管理器用于不同的路径并确保每个都有不同的 cookie 名称(使用 name 参数到 session() 选项)。然后,您必须将您的 URL 设计为它们的子路径,以便它们获得正确的路径。

    通常,人们只使用一个会话,然后在会话中保留一个标志,无论它是否是管理员登录,您可以在需要时检查该标志。

    【讨论】:

    • 非常感谢它的工作,但闪存消息没有改变,例如在“/用户/登录”中,当单击继续按钮而没有任何登录凭据时,它会生成一条闪存消息“请输入您的用户名和密码' 并且即使我重新加载该消息仍然存在,此消息仍保留在页面上,这是指向页面 link 的链接
    猜你喜欢
    • 2020-07-07
    • 2014-07-08
    • 2016-01-03
    • 2014-04-11
    • 2021-08-05
    • 2015-05-18
    • 2012-09-09
    • 2014-02-18
    • 2016-03-23
    相关资源
    最近更新 更多