Express 中操作 cookie 和 session
管理 cookie
设置 cookie(给客户端设置 cookie):
jsres.cookie("", "", {});
获取 cookie(要第三方中间件):
安装
bashnpm i cookie-parser
使用
jsconst cookieParser = require("cookie-parser"); // ... app.use(cookieParser());
返回给客户端一个 cookie:
jsres.cookie("username", "jack", { maxAge: 1000 * 60 * 60 });
备注:
- cookie 是以:key-value 的形式存在的,前两个参数分别为:key、value。
- maxAge 用于配置 cookie 有效期(单位毫秒)。
- 如果不传入 maxAge 配置对象,则为会话 cookie,随着浏览器的关闭 cookie 自动会消失。
- 如果传入 maxAge,且 maxAge 不为 0,则 cookie 为持久化 cookie,即使用户关闭浏览器,cookie 也不会消失,直到过了它的有效期。
接收客户端传递过来的 cookie:
获取 cookie 上 xxx 属性对应的值
jslet val = req.cookies.xxx;
备注:
cookie-parser
中间件会自动把客户端发送过来的 cookie 解析到 request 对象上。
管理 session(cookie 配合 session)
下载 express-session,用来管理 session
bashnpm i express-session --save
下载 connect-mongo,用于将 session 写入数据库(session 持久化)
bashnpm i connect-mongo --save
引入 express-session 模块:
jsconst session = require("express-session");
引入 connect-mongo 模块:
jsconst MongoStore = require("connect-mongo")(session);
编写全局配置对象:
jsapp.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的过期时间 }, }) );
向 session 中添加一个 xxxx,值为 yyy
jsreq.session.xxxx = yyy;
获取 session 上的 xxx 属性
jsconst { xxx } = req.session;
整个过程是:
- 客户端第一次发起请求,服务器开启一个 session 专门用于存储这次请求的一些信息。
- 根据配置对象的信息,服务器决定是否进行:session 持久化等其他操作。
- 与此同时服务器创建了一个 cookie,它的 key 我们可以自己指定,但是它的 value 一定是上一步 session 的唯一标识。
- 服务器将我们指定好的内容添加进 session 对象,例如:req.session.xxxx = yyy。
- 等请求再次过来时,客户端的请求中包含着之前“种”的 cookie。
- 服务器检查携带过来的 cookie 是否有效,决定是否去读取对应 session 中的信息。