Skip to content
本页内容

Express 中操作 cookie 和 session

  1. 设置 cookie(给客户端设置 cookie):

    js
    res.cookie("", "", {});
  2. 获取 cookie(要第三方中间件):

    • 安装

      bash
      npm i cookie-parser
    • 使用

      js
      const cookieParser = require("cookie-parser");
      
      // ...
      
      app.use(cookieParser());
  3. 返回给客户端一个 cookie:

    js
    res.cookie("username", "jack", { maxAge: 1000 * 60 * 60 });

    备注:

    1. cookie 是以:key-value 的形式存在的,前两个参数分别为:key、value。
    2. maxAge 用于配置 cookie 有效期(单位毫秒)。
    3. 如果不传入 maxAge 配置对象,则为会话 cookie,随着浏览器的关闭 cookie 自动会消失。
    4. 如果传入 maxAge,且 maxAge 不为 0,则 cookie 为持久化 cookie,即使用户关闭浏览器,cookie 也不会消失,直到过了它的有效期。
  4. 接收客户端传递过来的 cookie:

    获取 cookie 上 xxx 属性对应的值

    js
    let val = req.cookies.xxx;

    备注:cookie-parser中间件会自动把客户端发送过来的 cookie 解析到 request 对象上。

  1. 下载 express-session,用来管理 session

    bash
    npm i express-session --save
  2. 下载 connect-mongo,用于将 session 写入数据库(session 持久化)

    bash
    npm i connect-mongo --save
  3. 引入 express-session 模块:

    js
    const session = require("express-session");
  4. 引入 connect-mongo 模块:

    js
    const MongoStore = require("connect-mongo")(session);
  5. 编写全局配置对象:

    js
    app.use(
        session({
            name: "userid", // 设置cookie的key,默认值是:connect.sid
            secret: "atguigu", // 参与加密的字符串(又称签名)
            saveUninitialized: false, // 是否在存储内容之前创建会话
            resave: true, // 是否在每次请求时,强制重新保存session,即使他们没有变化
            store: new MongoStore({
                //session持久化
                url: "mongodb://localhost:27017/sessions_container",
                touchAfter: 24 * 3600, // 修改频率(例:在24小时之内只更新一次)
            }),
            cookie: {
                httpOnly: true, // 开启后前端无法通过 JS 操作cookie
                maxAge: 1000 * 30, // 设置cookie的过期时间
            },
        })
    );
  6. 向 session 中添加一个 xxxx,值为 yyy

    js
    req.session.xxxx = yyy;
  7. 获取 session 上的 xxx 属性

    js
    const { xxx } = req.session;

整个过程是:

  1. 客户端第一次发起请求,服务器开启一个 session 专门用于存储这次请求的一些信息。
  2. 根据配置对象的信息,服务器决定是否进行:session 持久化等其他操作。
  3. 与此同时服务器创建了一个 cookie,它的 key 我们可以自己指定,但是它的 value 一定是上一步 session 的唯一标识。
  4. 服务器将我们指定好的内容添加进 session 对象,例如:req.session.xxxx = yyy。
  5. 等请求再次过来时,客户端的请求中包含着之前“种”的 cookie。
  6. 服务器检查携带过来的 cookie 是否有效,决定是否去读取对应 session 中的信息。