express-session使用介绍
- session 存储位置: 默认是内存中, 推荐 redis
- 1.5.0 版本之后: 不需要借用
cookie-parser
, 可以直接读取 req.cookies, res.cookies
生成 session 会话
$ npm i express-session -S
var express = require("express");
var session = require("express-session");
var app = express();
var sess = session({
name: "sessionId", // 默认为connect.sid, 推荐使用自定义名称, 更安全
secret: "my_session_secret", // 建议使用 128 个字符的随机字符串
resave: false, // 即使session会话未更改, 也保存到store中
rolling: true, // 默认false, 是否每次请求都刷新会话有效期
saveUninitialized: true,
// store, // 默认存储在内存中(不推荐,容易内存泄漏), 可以改存放redis中
cookie: {
maxAge: 10 * 60 * 60 * 1000, // 过期时间(毫秒)
// expires, // 过期日期, 不推荐直接设置, 推荐使用maxAge
httpOnly: true // 禁止js操作cookie
}
});
app.use(sess); // 使用中间件
saveUninitialized 属性
- false:只有用户登录(req.session 对象被修改)才会生成 session 会话
- true:只要用户访问就会生成 session 会话
登录的时候修改session信息
// 登录接口
app.post("/user/login", function(req, res, next) {
if (req.body.user === "admin" && req.body.password === "123456") {
// 验证账号密码成功后, 将用户user写入session信息中
req.session.user = req.body.user;
res.redirect("/");
} else {
let error = req.body.user !== "admin" ? "账号错误" : "密码错误";
res.render("login", { error: error });
}
});
// 过滤登录状态中间件
app.use(function(req,res,next){
// session中有user属性说明是已登录状态
if (req.session.user || req.path=="/user/login") {
next();
} else {
res.redirect("/user/login");
}
})
req.session
对象常用属性和方法
1. 访问 session 信息
req.session; // 访问session数据
req.session.views = 1; // 给session中添加一个views属性, 值为1
2. 获取 cookie 信息
req.session.cookie; // 每个session都有唯一的cookie与之伴随, 允许你更改每个访问者的session cookie
3. 获取 sessionId
- 每个 session 都有一个与之关联的唯一 ID
req.session.id; // 属性是`req.sessionID`的别名且无法改变
4. 销毁 session
// 用户退出登录时调用
req.session.destroy(function(err) {
// cannot access session here
});
5. 重新生成 session
req.session.regenerate(function(err) {
// will have a new session here
});
6. 重载 session 数据
- 从 store 重载 session 数据, 填充 req.session 对象
req.session.reload(function(err) {
// session updated
});