Nodejs怎么用session保存用户在前后台的登录信息
Nodejs怎么用session保存用户在前后台的登录信息
我现在监听两个端口分别用着前后台登录![enter image description here][1]
[1]: /upload/50cbf5fb637ffa41556d22f2/1355549518256_%E6%9C%AA%E5%91%BD%E5%90%8D.jpg 为什么我在前台登陆后去在后台也登录 然后前台又必须重新登录才行 前后台保存的session名字也不一样
为了在 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 存储。通过设置相同的 secret
和 cookie
配置,可以确保前后台能够正确识别和验证 session。
解释
- session 中间件配置:通过
express-session
和connect-redis
来配置 session 存储。这里使用 Redis 作为存储后端。 - 登录逻辑:当用户成功登录时,我们将用户信息保存到
req.session.user
中。 - 检查登录状态:通过自定义中间件
checkLogin
来检查当前请求是否已登录。 - 保护路由:只有经过
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呢,又如何控制不同的过期时间呢?
有必要搞两个不同的端口吗