1. 什么是 express-session
express-session 是 Node.js 开发中的一个 session 中间件,由于 HTTP 协议本身是无状态的,所以使用 session 机制来维护客户端与服务端之间的状态。
session 机制的实现方式通常有两种:
- 使用 cookie,将 session id 存放在客户端浏览器的 cookie 中,服务端根据这个 session id 来查找用户对应的 session 数据。
- 使用 URL 重写,将 session id 放在 URL 中传输。
在 express-session 中,默认使用第一种方式来实现 session,使用 req.session 对象来获取或设置某个用户对应的 session 数据。
2. 使用 express-session
使用 express-session 的步骤如下:
- 2.1 安装 express-session
通过 npm 安装 express-session:
npm install express-session
- 2.2 引入 express-session
在 app.js 中引入 express-session:
var session = require('express-session');
- 2.3 使用 express-session
在 app.js 中使用 express-session:
app.use(session({
secret: 'keyboard cat', // 用于生成 session 的签名密钥
resave: false, // 每次请求是否重新生成 session id
saveUninitialized: true // 是否保存未初始化的 session
}));
- 2.4 获取或设置 session 数据
在路由中获取或设置 session 数据:
router.get('/', function(req, res, next) {
if (req.session.views) {
req.session.views++;
res.send('你已经访问过本站' + req.session.views + '次');
} else {
req.session.views = 1;
res.send('欢迎访问本站!');
}
});
在以上示例中,我们通过 req.session.views 来获取或设置用户对应的 session 数据,并将其发送给客户端浏览器。
3. 示例说明
下面通过两个示例来进一步说明 express-session 的使用。
- 3.1 用户登录
在用户登录后,通常需要记录用户的登录状态以便后续的操作。我们可以使用 express-session 来实现这个功能。
首先在用户登录成功后,将用户对应的数据保存在 session 中:
router.post('/login', function(req, res, next) {
if (req.body.username === 'admin' && req.body.password === '123456') {
req.session.user = req.body.username;
res.send({ code: 200, msg: '登录成功' });
} else {
res.send({ code: 400, msg: '用户名或密码错误' });
}
});
在用户访问其他路由时,判断用户是否已经登录:
router.get('/profile', function(req, res, next) {
if (req.session.user) { // 用户已登录
res.send('欢迎访问个人资料页面!');
} else { // 用户未登录
res.redirect('/login');
}
});
在以上示例中,我们通过 req.session.user 来存储用户的登录状态,并在其他路由中判断用户是否已经登录。
- 3.2 防止 CSRF 攻击
CSRF(Cross-site Request Forgery)攻击是指攻击者通过伪造用户已经登录的请求来冒充用户进行恶意操作的一种攻击方式。使用 express-session 可以很好地防止 CSRF 攻击。
通过在客户端浏览器中隐藏一个 csrfToken,然后在后续的请求中提交这个 csrfToken,可以有效地防止 CSRF 攻击。具体实现如下:
在登录页面中,生成一个 csrfToken 并存储在 session 中:
router.get('/login', function(req, res, next) {
var csrfToken = Math.random().toString(36).slice(2);
req.session.csrfToken = csrfToken;
res.render('login', { csrfToken: csrfToken });
});
在表单中包含 csrfToken,并在用户提交表单时进行验证:
<form action="/doSomething" method="post">
<input type="hidden" name="csrfToken" value="{{ csrfToken }}">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
router.post('/doSomething', function(req, res, next) {
var csrfToken = req.body.csrfToken;
if (req.session.csrfToken && csrfToken === req.session.csrfToken) { // csrfToken 验证通过
// 后续操作
} else { // csrfToken 验证不通过
res.send({ code: 400, msg: 'CSRF 攻击' });
}
});
在以上示例中,我们通过生成一个 csrfToken 并存储在 session 中,然后在表单中包含 csrfToken 并在后续的请求中进行验证,来防止 CSRF 攻击。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Node.js开发中的express-session - Python技术站