Cookies

未匹配的标注

你可以通过 请求响应 对象来访问cookie.请求对象暴露了操作cookie的一些方法,如:读取,创建,修改,删除等操作。

import Route from '@ioc:Adonis/Core/Route'

Route.post('add-to-cart', async ({ request, response }) => {
  /**
   * 通过名称读取cookie
   */
  const existingItems = request.cookie('cart-items', [])

  /**
   * 设置/修改 cookie
   */
  const newItems = existingItems.concat([{ id: 10 }])
  response.cookie('cart-items', newItems)
})

Route.delete('clear-cart', async ({ response }) => {
  /**
   * 删除 cookie
   */
  response.clearCookie('cart-items')
})

配置 Cookie

你可以在config/app.ts文件中,修改http.cookie 来配置Cookie。

// title: config/app.ts
http: {
  cookie: {
    domain: '',
    path: '/',
    maxAge: '2h',
    httpOnly: true,
    secure: false,
    sameSite: false,
  },
}

域(domain)

指定的 设置属性值
默认情况下,未设置域,大多数客户端会认为cookie只适用于当前域。


路径(path)

给cookie设置path属性,缺省情况下,该路径被视为“默认路径”。

存活周期(maxAge)

给cookie设置max-age属性。给定的值将被转换为整数。


httpOnly

给cookie设置max-age属性 ,这是一个 boolean 类型的变量。true 或 false。


secure

给cookie设置 secure属性,这是一个boolean 类型的变量。 缺省情况下,不设置Secure属性。


sameSite

Specifies the boolean or string to be the value for the samesite attribute.
给cookie设置 secure属性,可以boolean类型,也可以是string类型的值。设置不通的值,会有不同的效果,如下:

  • true 严格执行同一地点的规定。
  • false 不会设置SameSite属性。
  • 'lax' 同一域下的不严格检查。
  • 'none' 明确的支持跨站cookie。
  • 'strict' 将同一网站属性设置为严格的相同网站执行

设置 cookie 时,也可以在运行时定义相同的选项集。我们将内联值与默认配置合并。

response.cookie('user_id', 1, {
  httpOnly: false,
})

支持的数据类型

除了字符串值,还支持以下数据类型作为 cookie 值。

// 对象
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)

// 数据对象转换为 ISO 字符串
response.cookie('visits', new Date())

签名cookies

默认情况下,所有由response.cookie方法设置的 cookie 都是签名的。签名 cookie 在 cookie 值旁边包含一个签名,以防止 cookie 被篡改。

  • 签名是根据 cookie 值计算出来的,如果被篡改,签名会不匹配,AdonisJS 会忽略 cookie。
  • 使用config/app.ts文件中存储的appKey生成签名。
  • 签名的 cookie 仍然可以通过 Base64 解码读取。如果您希望该值不可读,则可以使用加密的 cookie。
Route.get('/', async ({ request, response }) => {
  // 设置签名cookie
  response.cookie('user_id', 1)

  // 读取签名的 cookie
  request.cookie('user_id')
})

加密cookies

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

  • cookie 值使用 Encryption 模块加密。
  • 它使用存储在config/app.ts文件中的appKey作为加密密钥。

加密的 cookie 是使用response.encryptedCookie方法定义的。例如:

Route.get('/', async ({ response }) => {
  response.encryptedCookie('user_id', 1)
})

同样,要读取 cookie 值,你必须使用request.encryptedCookie方法。

Route.get('/', async ({ request }) => {
  console.log(request.encryptedCookie('user_id'))
})

普通Cookie

普通 cookie 保存 Base64 编码值,没有签名或加密。当你想要访问前端 JavaScript 上的 cookie 并读/写其值时,它们通常很有帮助。

你可以使用plainCookie方法定义纯 cookie。例如:

Route.get('/', async ({ response }) => {
  response.plainCookie('user_id', 1)
})

如果你想在前端 JavaScript 中访问此 cookie,请确保禁用httpOnly标志。

response.plainCookie('user_id', 1, {
  httpOnly: false,
})

你可以使用document.cookie属性在 JavaScript 中读取 cookie 值。确保 Base64 解码和 JSON 解析值。

注:下面的例子是一个简单的读取cookie值的实现,仅供演示。

/**
 * 读取cookie值
 */
const userIdValue = document.cookie.split('user_id=')[1].split(';')[0]

/**
 * Base 64 解码值
 */
const base64Decoded = atob(userIdValue)

/**
 * 将 JSON 字符串转换为对象
 */
const jsonParsed = JSON.parse(base64Decoded)
console.log(jsonParsed)

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/adonisjs/5.x/ht...

译文地址:https://learnku.com/docs/adonisjs/5.x/ht...

上一篇 下一篇
贡献者:4
讨论数量: 0
发起讨论 只看当前版本


暂无话题~