ExpressJS - Sessions
Express.js 会话现代指南
Section titled “Express.js 会话现代指南”HTTP 本质上是无状态的。为了在多个请求(例如购物车或登录状态)之间维护用户特定的数据,我们使用会话(sessions)。会话的工作方式是给客户端一个唯一的 ID(通常在 cookie 中)。客户端在每次请求时发送此 ID,服务器使用它来检索存储的会话数据。这会将敏感的会话数据保留在服务器上,而不是客户端上。
我们将使用标准的 express-session 中间件来管理会话。
# 安装会话中间件$ npm install express-session在下面的示例中,我们将配置 express-session 中间件。对于开发环境,默认的 MemoryStore 还可以,但它不适合生产环境,因为它会泄漏内存并且无法扩展到单个进程之外。对于生产环境,始终使用持久性会话存储,例如 connect-redis 或 connect-mongo。
示例:一个简单的页面访问计数器
Section titled “示例:一个简单的页面访问计数器”此应用程序演示了一个基本的会话。当用户首次访问时,我们会在他们的会话上初始化一个 page_views 属性。在同一用户后续访问时,我们会递增计数器。
index.js
Section titled “index.js”import express from 'express';import session from 'express-session';import 'dotenv/config'; // 用于加载环境变量
const app = express();const PORT = 3000;
// **安全最佳实践**:会话密钥应该是一个随机的、长字符串,// 存储在环境变量中,而不是硬编码。if (!process.env.SESSION_SECRET) { console.error('FATAL ERROR: SESSION_SECRET is not defined.'); process.exit(1);}
app.use(session({ secret: process.env.SESSION_SECRET, resave: false, // 如果会话未修改,则不保存 saveUninitialized: false, // 直到存储了某些内容才创建会话 cookie: { secure: process.env.NODE_ENV === 'production', // 在生产环境中使用安全 cookie httpOnly: true, // 防止客户端 JS 读取 cookie maxAge: 1000 * 60 * 60 // Cookie 过期时间(毫秒,例如 1 小时) }}));
app.get('/', (req, res) => { if (req.session.page_views) { req.session.page_views++; res.send(`You have visited this page ${req.session.page_views} times.`); } else { req.session.page_views = 1; res.send('Welcome! This is your first visit.'); }});
app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`);});secret:这用于签署会话 ID cookie。它应该是一个长而随机的字符串,安全地存储在环境变量中(例如,在.env文件中)。resave: false:这是一个推荐的设置。它防止会话在请求期间未修改时被保存回会话存储。saveUninitialized: false:另一个推荐的设置。它阻止为用户创建会话,直到实际存储了一些内容,这节省了存储空间并符合某些隐私法规。cookie.secure: true:在生产环境中,这应该为true。它确保浏览器仅通过 HTTPS 发送 cookie。req.session:中间件将一个session对象添加到请求 (req) 中。您可以向其中附加任何可序列化数据。更改会在请求结束时自动保存。
运行应用程序并访问 http://localhost:3000 后,您将看到欢迎消息。刷新页面将增加访问计数,这表明会话在请求之间是持久的。