1.0 前言

经常我们在登陆后会在 Cookie 中 设置一些用户登陆信息,这节我们结合登陆的例子,一起学习 Koa 操作 Cookie,假设你还不知道什么是 Cookie 建议查看 MDN Cookie 相关文档 或者网上相关文章介绍。

2.0 使用方法

2.1 基本使用

koa 提供了从上下文直接读取、写入 Cookie 的方法:

  • ctx.cookies.get(name, [options]) 读取上下文请求中的 Cookie。
  • ctx.cookies.set(name, value, [options]) 在上下文中写入Cookie。

我们先来个简单的例子,接上节登陆页页面路由跳转,我们在登陆后忘 Cookie 写入用户名字。

登陆界面如下:
登陆逻辑如下 Demo 如下:

  1. // controller/login.js
  2. function login(ctx) {
  3. const token = '121212-45dfgffgfg'
  4. console.log('ctx.res.header', ctx.response.header)
  5. ctx.response.header.token = token
  6. ctx.app.userInfo = {
  7. name: '王二码字'
  8. }
  9. ctx.cookies.set(
  10. 'token', // key
  11. token, // value
  12. {
  13. domain: 'localhost', // 写cookie所在的域名
  14. path: '/', // 写cookie所在的路径
  15. maxAge: 10 * 60 * 1000, // cookie有效时长
  16. expires: new Date('2020-08-02'), // cookie失效时间
  17. httpOnly: false, // 是否只用于http请求中获取
  18. overwrite: false // 是否允许重写
  19. }
  20. )
  21. ctx.redirect('/')
  22. }
  23. module.exports = {
  24. login
  25. }

这个时候输完用户名密码,我们可以在浏览器的 调试工具 可以查看 Cookie。
image.png
这样我们就把 token 这个字段写到 Cookie 里面了,之后我们每次请求都会带上 Cookie,同样的 我们想在后端获取到 Cookie 信息,直接通过下面方法就好。

  1. ctx.cookies.get('token') // '121212-45dfgffgfg'

这样我就获取到了 Cookie 信息。

2.2 options 参数设置

Cookie 的设置和获取还是很容易,接下来我们一起梳理下 ctx.cookies.set(name, value, [options]), options 参数:

  • maxAge: 一个数字, 表示从 Date.now() 得到的毫秒数.
  • expires: 一个 Date 对象, 表示 cookie 的到期日期 (默认情况下在会话结束时过期).
  • path: 一个字符串, 表示 cookie 的路径 (默认是/).
  • domain: 一个字符串, 指示 cookie 的域 (无默认值).
  • secure: 一个布尔值, 表示 cookie 是否仅通过 HTTPS 发送 (HTTP 下默认为 false, HTTPS 下默认为 true). 阅读有关此参数的更多信息.
  • httpOnly: 一个布尔值, 表示 cookie 是否仅通过 HTTP(S) 发送,, 且不提供给客户端 JavaScript (默认为 true).
  • sameSite: 一个布尔值或字符串, 表示该 cookie 是否为 “相同站点” cookie (默认为 false). 可以设置为 'strict', 'lax', 'none', 或 true (映射为 'strict').
  • signed: 一个布尔值, 表示是否要对 cookie 进行签名 (默认为 false). 如果为 true, 则还会发送另一个后缀为 .sig 的同名 cookie, 使用一个 27-byte url-safe base64 SHA1 值来表示针对第一个 Keygrip 键的 cookie-name=cookie-value 的哈希值. 此签名密钥用于检测下次接收 cookie 时的篡改.
  • overwrite: 一个布尔值, 表示是否覆盖以前设置的同名的 cookie (默认是 false). 如果是 true, 在同一个请求中设置相同名称的所有 Cookie(无论路径或域)是否在设置此Cookie 时从 Set-Cookie 消息头中过滤掉.

2.3 删除现有Cookie

要取消设置cookie,只需将cookie设置为空字符串即可。 例如,如果需要清除名为foo的cookie,请使用以下代码。

  1. ctx.cookies.set('token', '')

3.0 总结

这里我们学习了 Koa 操作 Cookie 的基本使用,工作中比较常见,大家可以好好学习,大家可以从 github 获取 案例Demo,Demo 地址