You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.5 KiB
TypeScript

1 month ago
// utils/cookie.ts
import Cookies from 'js-cookie'
import { parse } from 'cookie'
// 服务端解析 Cookie从请求头
export const getServerCookie = (key: string, reqHeaders?: Headers) => {
// if (typeof window !== 'undefined') return undefined // 仅服务端使用
const cookieHeader = reqHeaders?.get('cookie') || ''
const parsed = parse(cookieHeader)
console.log("Server Get Cookie:", parsed);
return parsed[key]
}
// 客户端读取 Cookie
export const getClientCookie = (key: string): string | undefined => {
// if (typeof window === 'undefined') return undefined
return Cookies.get(key)
}
// 统一获取 Cookie自动判断环境
export const getCookie = (key: string, reqHeaders?: Headers) => {
if (typeof window !== 'undefined') {
console.log("CSR获取");
return getClientCookie(key)
} else {
console.log("SSR获取", reqHeaders);
return getServerCookie(key, reqHeaders)
}
}
// 设置 Cookie客户端和服务端
export const setCookie = (key: string, value: string, expiresDays: number = 7) => {
// if (typeof window !== 'undefined') {
Cookies.set(key, value, {
// httpOnly: true,
expires: expiresDays,
path: '/',
secure: process.env.NODE_ENV === 'production', // 生产环境启用 HTTPS
sameSite: 'Lax' // 防止 CSRF 攻击
})
// }
}
// 移除 Cookie
export const removeCookie = (key: string) => {
// if (typeof window !== 'undefined') {
Cookies.remove(key)
// }
}