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