express-session使用介绍

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 属性

  1. false:只有用户登录(req.session 对象被修改)才会生成 session 会话
  2. 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
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
});