Nodejs怎么用session保存用户在前后台的登录信息

Nodejs怎么用session保存用户在前后台的登录信息

我现在监听两个端口分别用着前后台登录![enter image description here][1]

[1]: /upload/50cbf5fb637ffa41556d22f2/1355549518256_%E6%9C%AA%E5%91%BD%E5%90%8D.jpg 为什么我在前台登陆后去在后台也登录 然后前台又必须重新登录才行 前后台保存的session名字也不一样

6 回复

为了在 Node.js 应用中使用 session 来保存用户在前后台的登录信息,你需要确保前后台共享同一个 session 存储机制。通常情况下,你可以使用一个 session 中间件来实现这一功能,比如 express-session。此外,你还需要配置一个持久化的存储机制,例如 Redis 或数据库,以确保 session 数据可以跨多个进程或服务器共享。

示例代码

首先,安装必要的依赖:

npm install express express-session cookie-parser connect-redis redis

然后,创建一个简单的 Express 应用来处理前后台的登录请求,并使用 session 来保存用户的登录状态:

const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const cookieParser = require('cookie-parser');
const app = express();

// 配置 session 中间件
app.use(cookieParser());
app.use(session({
  store: new RedisStore(), // 使用 Redis 存储 session 数据
  secret: 'your_secret_key', // 加密 session ID 的密钥
  resave: false,
  saveUninitialized: false,
  cookie: {
    secure: false, // 如果你在生产环境中使用 HTTPS,请设置为 true
    maxAge: 24 * 60 * 60 * 1000 // 设置 session 的过期时间为 24 小时
  }
}));

// 假设这是你的登录逻辑
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  if (username === 'admin' && password === 'password') {
    req.session.user = { username };
    res.send({ success: true });
  } else {
    res.send({ success: false, message: 'Invalid credentials' });
  }
});

// 检查登录状态的中间件
function checkLogin(req, res, next) {
  if (!req.session.user) {
    return res.status(401).send({ success: false, message: 'Not logged in' });
  }
  next();
}

// 保护路由,只有登录用户才能访问
app.get('/protected', checkLogin, (req, res) => {
  res.send({ user: req.session.user });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在这个例子中,我们使用了 RedisStore 来存储 session 数据,这样前后台可以共享同一个 session 存储。通过设置相同的 secretcookie 配置,可以确保前后台能够正确识别和验证 session。

解释

  1. session 中间件配置:通过 express-sessionconnect-redis 来配置 session 存储。这里使用 Redis 作为存储后端。
  2. 登录逻辑:当用户成功登录时,我们将用户信息保存到 req.session.user 中。
  3. 检查登录状态:通过自定义中间件 checkLogin 来检查当前请求是否已登录。
  4. 保护路由:只有经过 checkLogin 中间件验证的请求才能访问 /protected 路由。

通过这种方式,你可以确保前后台共享同一个 session 存储,从而避免在前台登录后需要在后台重新登录的问题。


补充问题 app如下:

/**

  • Module dependencies. */

var express = require(‘express’) , http = require(‘http’) , path = require(‘path’) , flash = require(‘connect-flash’) , restRoute = require(’./routes/rest-route’) , webRoute = require(’./routes/web-route’) , adminRoute = require(’./routes/admin-route’);

var app = express(); var adminapp = express();

app.configure(function(){ app.set(‘port’, process.env.PORT || 3000); app.set(‘views’, __dirname + ‘/views’); app.set(‘view engine’, ‘ejs’); app.use(express.favicon()); app.use(express.logger(‘dev’)); app.use(express.bodyParser({keepExtensions: true, uploadDir: ‘/uploads’ })); app.use(express.methodOverride()); app.use(flash()); app.use(express.cookieParser(‘your secret here’)); app.use(express.session({secret: “wind”})); app.use(app.router); app.use(express.static(path.join(__dirname, ‘assets’))); app.use(express.static(path.join(__dirname, ‘uploads’))); app.use(express.limit(‘3mb’)); });

app.configure(‘development’, function(){ app.use(express.errorHandler()); });

adminapp.configure(function(){ adminapp.set(‘port’, process.env.PORT || 3001); adminapp.set(‘views’, __dirname + ‘/views/admin’); adminapp.set(‘view engine’, ‘ejs’); adminapp.use(express.favicon()); adminapp.use(express.logger(‘dev’)); adminapp.use(express.bodyParser({keepExtensions: true, uploadDir: ‘/uploads’ })); adminapp.use(express.methodOverride()); adminapp.use(flash()); adminapp.use(express.cookieParser(‘your secret here’)); adminapp.use(express.session({secret: “wind”})); adminapp.use(adminapp.router); adminapp.use(express.static(path.join(__dirname, ‘assets’))); adminapp.use(express.static(path.join(__dirname, ‘uploads’))); adminapp.use(express.limit(‘3mb’)); });

adminapp.configure(‘development’, function(){ adminapp.use(express.errorHandler()); });

//web routers map webRoute.mapRoutes(app);

//admin routers map adminRoute.mapRoutes(adminapp);

//app.listen(3000); http.createServer(app).listen(3000); console.log(‘Express app started on port 3000’);

//adminapp.listen(3001); http.createServer(adminapp).listen(3001); console.log(‘Express app started on port 3001’);

不是一个连接,自然就不是一个session

如果是同一个连接呢,分前后台,分别存储注册用户和系统管理员的session,是否需要新建一个session呢,又如何控制不同的过期时间呢?

有必要搞两个不同的端口吗

为了在前后台之间共享用户的登录状态,可以使用相同的 session 名称和存储机制。以下是解决这个问题的步骤和示例代码。

步骤

  1. 使用同一个 session 存储机制:确保前后台服务器使用相同的 session 存储方式(如内存、Redis、数据库等)。
  2. 配置 session:在前后台服务器中使用同一个 session 中间件,并设置相同的 secret key。
  3. 设置 session 名称一致:确保在前后台服务器中的 session 名称相同。

示例代码

安装依赖

npm install express express-session cookie-parser

前台服务器 (app.js)

const express = require('express');
const session = require('express-session');

const app = express();

app.use(cookieParser());
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false } // 如果使用 HTTPS,请设置为 true
}));

app.get('/login', (req, res) => {
    req.session.user = { username: 'testUser' };
    res.send('Logged in!');
});

app.get('/check', (req, res) => {
    if (req.session.user) {
        res.send(`Hello ${req.session.user.username}`);
    } else {
        res.send('Not logged in');
    }
});

app.listen(3000, () => console.log('Frontend server running on port 3000'));

后台服务器 (adminApp.js)

const express = require('express');
const session = require('express-session');

const app = express();

app.use(cookieParser());
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false } // 如果使用 HTTPS,请设置为 true
}));

app.get('/login', (req, res) => {
    req.session.user = { username: 'testUser' };
    res.send('Logged in!');
});

app.get('/check', (req, res) => {
    if (req.session.user) {
        res.send(`Hello ${req.session.user.username}`);
    } else {
        res.send('Not logged in');
    }
});

app.listen(3001, () => console.log('Admin server running on port 3001'));

解释

  • secret 是一个用于加密 session 的密钥。前后台服务器需要使用相同的 secret
  • cookie 配置中的 secure 参数根据你的环境进行调整。如果使用 HTTPS,应将其设置为 true
  • resavesaveUninitialized 是用于配置 session 存储行为的选项。
  • 在登录请求中,我们将用户信息保存到 req.session.user
  • 在检查登录状态的请求中,我们从 req.session.user 获取用户信息并返回。

通过以上配置,前后台服务器将共享同一个 session 存储,并且用户登录状态可以在前后台之间保持一致。

回到顶部