Cookie

Cookies

请求 cookie 会在 HTTP 请求期间自动解析。你可以使用 request 对象读取 cookie,并使用 response 对象设置/清除 cookie。

Read cookies
import router from '@adonisjs/core/services/router'
router.get('cart', async ({ request }) => {
const cartItems = request.cookie('cart_items', [])
console.log(cartItems)
})
Set cookies
import router from '@adonisjs/core/services/router'
router.post('cart', async ({ request, response }) => {
const id = request.input('product_id')
response.cookie('cart_items', [{ id }])
})
Clear cookies
import router from '@adonisjs/core/services/router'
router.delete('cart', async ({ request, response }) => {
response.clearCookie('cart_items')
})

配置

设置 cookie 的默认配置定义在 config/app.ts 文件中。欢迎根据你的应用需求调整这些选项。

http: {
cookie: {
domain: '',
path: '/',
maxAge: '2h',
httpOnly: true,
secure: true,
sameSite: 'lax',
/**
* 实验性属性
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#partitioned
*/
partitioned: false,
priority: 'medium',
}
}

这些选项会被转换为 set-cookie 属性maxAge 属性接受基于字符串的时间表达式,其值会被转换为秒。

同一组选项可以在设置 cookie 时被覆盖。

response.cookie('key', value, {
domain: '',
path: '/',
maxAge: '2h',
httpOnly: true,
secure: true,
sameSite: 'lax',
})

支持的数据类型

cookie 值使用 JSON.stringify 序列化为字符串;因此,你可以使用以下 JavaScript 数据类型作为 cookie 值。

  • string
  • number
  • bigInt
  • boolean
  • null
  • object
  • array
// 对象
response.cookie('user', {
id: 1,
fullName: 'virk',
})
// 数组
response.cookie('product_ids', [1, 2, 3, 4])
// 布尔值
response.cookie('is_logged_in', true)
// 数字
response.cookie('visits', 10)
// BigInt
response.cookie('visits', BigInt(10))
// 日期对象会被转换为 ISO 字符串
response.cookie('visits', new Date())

使用 response.cookie 方法设置的 cookie 是签名的。签名 cookie 是不可篡改的,意味着更改其内容会使签名失效,该 cookie 将被忽略。

cookie 使用定义在 config/app.ts 文件中的 appKey 进行签名。

签名 cookie 仍然可以通过 Base64 解码来读取。如果你希望 cookie 值不可读,可以使用加密 cookie。

import router from '@adonisjs/core/services/router'
router.get('/', async ({ request, response }) => {
// 设置签名 cookie
response.cookie('user_id', 1)
// 读取签名 cookie
request.cookie('user_id')
})

与签名 cookie 不同,加密 cookie 的值无法被解码为纯文本。因此,你可以将加密 cookie 用于包含敏感信息、不应被任何人读取的值。

加密 cookie 使用 response.encryptedCookie 方法设置,并使用 request.encryptedCookie 方法读取。底层,这些方法使用了 Encryption 模块

import router from '@adonisjs/core/services/router'
router.get('/', async ({ request, response }) => {
// 设置加密 cookie
response.encryptedCookie('user_id', 1)
// 读取加密 cookie
request.encryptedCookie('user_id')
})

普通 cookie 用于当你希望前端代码通过 document.cookie 值访问该 cookie 时。

默认情况下,我们对原始值调用 JSON.stringify 并将其转换为 base64 编码的字符串。这样做是为了让你可以使用 objectsarrays 作为 cookie 值。不过,编码可以关闭。

普通 cookie 使用 response.plainCookie 方法定义,可以使用 request.plainCookie 方法读取。

import router from '@adonisjs/core/services/router'
router.get('/', async ({ request, response }) => {
// 设置普通 cookie
response.plainCookie('user', { id: 1 }, {
httpOnly: true
})
// 读取普通 cookie
request.plainCookie('user')
})

要关闭编码,在 options 对象中设置 encoding: false

response.plainCookie('token', tokenValue, {
httpOnly: true,
encode: false,
})
// 关闭编码后读取普通 cookie
request.plainCookie('token', {
encoded: false
})

以下指南涵盖了在编写测试时 cookie 的使用方法。