|
|
// plugins/cookie.server.ts
|
|
|
import { defineNuxtPlugin, useRequestHeaders, useRequestEvent } from '#app'
|
|
|
import { parse, serialize } from 'cookie'
|
|
|
import type { SerializeOptions } from 'cookie'
|
|
|
|
|
|
export default defineNuxtPlugin(() => {
|
|
|
const event = useRequestEvent()
|
|
|
const headers = useRequestHeaders(['cookie'])
|
|
|
|
|
|
// 解析请求中的Cookie
|
|
|
const requestCookies = headers.cookie ? parse(headers.cookie) : {}
|
|
|
|
|
|
return {
|
|
|
provide: {
|
|
|
serverCookie: {
|
|
|
// 获取Cookie
|
|
|
get: (name: string) => {
|
|
|
return requestCookies[name]
|
|
|
},
|
|
|
|
|
|
// 获取所有Cookie
|
|
|
getAll: () => {
|
|
|
return { ...requestCookies }
|
|
|
},
|
|
|
|
|
|
// 设置Cookie(响应头)
|
|
|
set: (name: string, value: string, options: Partial<SerializeOptions> = {}) => {
|
|
|
if (event?.node?.res) {
|
|
|
const cookie = serialize(name, value, {
|
|
|
path: '/',
|
|
|
sameSite: 'lax',
|
|
|
...options
|
|
|
} as SerializeOptions)
|
|
|
|
|
|
// 处理Set-Cookie头
|
|
|
const existingCookies = event.node.res.getHeader('Set-Cookie')
|
|
|
let cookiesArray: string[] = []
|
|
|
|
|
|
if (Array.isArray(existingCookies)) {
|
|
|
cookiesArray = [...existingCookies]
|
|
|
} else if (typeof existingCookies === 'string') {
|
|
|
cookiesArray = [existingCookies]
|
|
|
}
|
|
|
|
|
|
cookiesArray.push(cookie)
|
|
|
event.node.res.setHeader('Set-Cookie', cookiesArray)
|
|
|
}
|
|
|
},
|
|
|
|
|
|
// 删除Cookie
|
|
|
remove: (name: string, options: Partial<SerializeOptions> = {}) => {
|
|
|
if (event?.node?.res) {
|
|
|
const cookie = serialize(name, '', {
|
|
|
...options,
|
|
|
maxAge: 0,
|
|
|
expires: new Date(0)
|
|
|
} as SerializeOptions)
|
|
|
|
|
|
const existingCookies = event.node.res.getHeader('Set-Cookie')
|
|
|
let cookiesArray: string[] = []
|
|
|
|
|
|
if (Array.isArray(existingCookies)) {
|
|
|
cookiesArray = [...existingCookies]
|
|
|
} else if (typeof existingCookies === 'string') {
|
|
|
cookiesArray = [existingCookies]
|
|
|
}
|
|
|
|
|
|
cookiesArray.push(cookie)
|
|
|
event.node.res.setHeader('Set-Cookie', cookiesArray)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}) |