useCookie函数:管理SSR环境下的Cookie
title: useCookie函数:管理SSR环境下的Cookie
date: 2024/7/13
updated: 2024/7/13
author: cmdragon
excerpt:
摘要:本文详述了useCookie函数在服务器端渲染(SSR)中的应用,包括读写Cookie、配置选项如maxAge、expires、httpOnly、secure、domain、path及SameSite,并提供了encode、decode、default、watch等高级用法示例,以及如何在API路由中操作Cookie。
categories:
- 前端开发
tags:
- Nuxt3
- SSR
- Cookies
- HTTP
- 安全
- 编程
- 前端
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
useCookie
是一个在服务器端渲染(SSR)环境中管理 Cookie 的工具函数。它允许开发者在页面、组件或插件中读取和写入 Cookie。这个函数通过创建一个响应式引用(ref)来管理 Cookie 的值,并自动将 Cookie 的值序列化和反序列化为 JSON 格式,以确保在不同环境(如浏览器和服务器)之间的一致性。
基本用法
useCookie
函数接受两个参数:
- name:这是一个字符串,用于标识特定的 Cookie。
- options:这是一个对象,包含了用于配置 Cookie 的选项。
简单示例
下面的示例创建了一个名为counter
的cookie。如果该cookie不存在,它将被初始设置为一个随机值。每当我们更新counter
变量时,cookie也会相应地更新。
app.vue
<script setup>
const counter = useCookie('counter')
counter.value = counter.value || Math.round(Math.random() * 1000)
</script>
<template>
<div>
<h1>计数器: {{ counter || '-' }}</h1>
<button @click="counter = null">重置</button>
<button @click="counter--">减少</button>
<button @click="counter++">增加</button>
</div>
</template>
options选项
maxAge
/ expires
maxAge
- 用途:
maxAge
用于指定cookie在客户端存储的时间长度(以秒为单位)。 - 优先级:当
maxAge
和expires
同时设置时,maxAge
优先。这意味着如果设置了maxAge
,则不会使用expires
。 - 客户端行为:如果设置了
maxAge
,cookie将在服务器设置的时间后过期,即使浏览器关闭也会保留。 - 示例:
Set-Cookie: mycookie=123; max-age=3600;
expires
- 用途:
expires
用于指定cookie的过期时间,它是一个特定的日期和时间,格式为Wdy, DD-Mon-YYYY HH:MM:SS GMT
。 - 客户端行为:如果设置了
expires
,cookie将在这个日期和时间后过期,无论浏览器是否关闭。 - 示例:
Set-Cookie: mycookie=123; expires=Thu, 01 Dec 2023 12:00:00 GMT;
同时设置 maxAge
和 expires
- 规范:根据cookie存储模型规范,如果同时设置了
maxAge
和expires
,则maxAge
应该优先。 - 兼容性:尽管规范如此,但并非所有客户端都会严格遵循这一规定。因此,如果需要确保cookie的过期行为一致,应该在服务器端只设置一个。
- 示例:如果需要同时设置,确保它们指向相同的日期和时间。
默认行为
- 无设置:如果没有设置
maxAge
和expires
,cookie将仅在会话期间存在,这意味着一旦用户关闭浏览器,cookie将被删除。
实际应用
在实际应用中,通常建议只使用 maxAge
或 expires
中的一个,以避免潜在的不一致性和兼容性问题。如果需要cookie在用户关闭浏览器后仍然存在,可以使用 maxAge
。如果需要cookie在特定日期和时间后过期,则使用 expires
。
以下是一个使用 maxAge
和 expires
的示例:
// 使用 maxAge
res.setHeader('Set-Cookie', 'mycookie=123; max-age=3600;');
// 使用 expires
res.setHeader('Set-Cookie', 'mycookie=123; expires=Thu, 01 Dec 2023 12:00:00 GMT;');
httpOnly
httpOnly
是一个用于设置cookie属性的布尔值,它的主要目的是增强Web应用程序的安全性。
httpOnly
属性的用途
- 用途:当
httpOnly
设置为true
时,它会指示浏览器不允许通过JavaScript的document.cookie
API访问该cookie。这意味着,即使cookie存储在用户的浏览器中,也无法通过客户端脚本(如JavaScript)读取它。 - 安全性:这个属性可以防止跨站脚本攻击(XSS),因为即使攻击者通过脚本注入攻击控制了用户的会话,他们也无法通过脚本获取到设置了
httpOnly
的cookie。
设置 httpOnly
- 值:
httpOnly
可以是true
或false
。如果是true
,则设置HttpOnly属性;如果是false
或未设置,则不设置HttpOnly属性。 - 默认值:默认情况下,
httpOnly
属性是不设置的。
实际应用
在实际应用中,建议对所有涉及身份验证、敏感信息的cookie设置 httpOnly
属性。例如,对于存储用户会话ID的cookie,应该始终设置 httpOnly
。
以下是如何在设置cookie时使用 httpOnly
属性的示例:
// 设置 httpOnly 为 true
res.setHeader('Set-Cookie', 'sessionToken=abc123; httpOnly;');
// 在某些服务器框架中,可能需要这样设置
// res.cookie('sessionToken', 'abc123', { httpOnly: true });
注意事项
- 当
httpOnly
设置为true
时,请确保您的JavaScript代码中不要尝试通过document.cookie
访问该cookie,因为这会导致错误。 - 由于
httpOnly
cookie不能通过客户端脚本访问,因此如果您需要在客户端脚本中使用这些cookie(例如,用于客户端逻辑或显示),则需要考虑其他方法来安全地传输所需的信息。
通过使用 httpOnly
,您可以显著提高应用程序的安全性,减少XSS攻击的风险。
secure
secure
是另一个用于设置cookie属性的布尔值,它的目的是确保cookie仅通过安全的HTTPS连接发送到服务器。下面是关于 secure
属性的详细信息:
secure
属性的用途
- 用途:当
secure
设置为true
时,cookie将只通过HTTPS连接发送。这意味着如果浏览器尝试通过不安全的HTTP连接发送设置了secure
属性的cookie,浏览器会忽略这个cookie,并且不会将其发送到服务器。 - 安全性:这个属性有助于防止中间人攻击,因为它确保了cookie在客户端和服务器之间传输时的加密。
设置 secure
- 值:
secure
可以是true
或false
。如果是true
,则设置Secure属性;如果是false
或未设置,则不设置Secure属性。 - 默认值:默认情况下,
secure
属性是不设置的。
实际应用
在实际应用中,对于包含敏感信息的cookie,如会话cookie,通常建议设置 secure
属性为 true
。
以下是如何在设置cookie时使用 secure
属性的示例:
// 设置 secure 为 true
res.setHeader('Set-Cookie', 'sessionToken=abc123; secure;');
注意事项
- HTTPS连接:当
secure
设置为true
时,如果网站没有启用HTTPS,那么设置了secure
属性的cookie不会被发送到服务器。这可能导致用户在浏览器中看到“无法连接到服务器”的错误消息,或者在某些情况下,可能导致所谓的“hydration错误”,即服务器无法识别客户端发送的cookie。 - 混合内容:如果网站中包含一些通过HTTP加载的静态资源(如图片、CSS、JavaScript文件),并且设置了
secure
属性的cookie,那么这些资源可能会因为浏览器尝试发送安全的cookie而不被正确加载。 - 兼容性:大多数现代浏览器都支持
secure
属性,但在某些旧版浏览器中可能不支持。
domain
domain
属性在设置 Set-Cookie
的时候用于指定 cookie 的作用域。这个属性允许你定义 cookie 可以被哪些子域名或顶级域访问。默认情况下,cookie 只在当前请求的域内有效。
domain
属性的用途
- 定义作用域:
domain
属性允许你指定 cookie 的作用域,使得 cookie 可以在指定的域及其所有子域下被访问。 - 跨域共享:通过设置
domain
属性,可以让 cookie 跨越多个子域共享,这对于需要在不同子域间共享状态信息的网站特别有用。
实际应用
以下是如何在设置 cookie 时使用 domain
属性的示例:
// 设置 domain 为 'example.com'
res.setHeader('Set-Cookie', 'sessionToken=abc123; domain=example.com;');
注意事项
- 子域兼容性:确保所有子域都支持相同的
domain
值。如果不兼容,可能会导致 cookie 不被正确设置或访问。 - 安全性:设置
domain
为顶级域(如.example.com
)可以增加安全性,因为这限制了 cookie 的访问范围。然而,这也会限制了跨子域的 cookie 使用。 - 浏览器兼容性:大多数现代浏览器都支持
domain
属性,但在一些旧版浏览器中可能不支持。
示例
假设你有一个包含多个子域的网站,例如 www.example.com
、sub.example.com
和 api.example.com
。如果你想让一个 cookie 能在所有这些子域下被访问,你可以设置 domain
为 example.com
:
res.setHeader('Set-Cookie', 'sessionToken=abc123; domain=example.com;');
这样设置后,sessionToken
将在 www.example.com
、sub.example.com
和 api.example.com
下都能被访问。
path
path
属性在设置 Set-Cookie
的时候用于指定 cookie 的有效路径。这个属性允许你定义 cookie 可以被哪些路径下的请求访问。默认情况下,路径被设置为当前请求的路径。
path
属性的用途
- 定义有效路径:
path
属性允许你指定 cookie 的有效路径,使得 cookie 只能在指定的路径及其子路径下被访问。 - 路径限制:通过设置
path
属性,可以限制 cookie 的使用范围,从而提高安全性。
实际应用
以下是如何在设置 cookie 时使用 path
属性的示例:
// 设置 path 为 '/admin'
res.setHeader('Set-Cookie', 'sessionToken=abc123; path=/admin;');
注意事项
- 路径匹配:路径是前缀匹配的,所以设置
path=/admin
意味着 cookie 在/admin
、/admin/settings
等路径下都有效。 - 默认路径:如果没有指定
path
属性,默认路径是当前请求的路径。例如,如果请求的路径是/user/profile
,那么默认路径就是/user/profile
。 - 安全性:通过设置
path
属性,可以限制 cookie 的使用范围,从而提高安全性。例如,将 cookie 限制在/admin
路径下,可以防止它在其他非管理区域被访问。
示例
假设你有一个网站,其中 /admin
路径下的内容需要特殊的 cookie 来验证用户权限。你可以设置 path
为 /admin
:
res.setHeader('Set-Cookie', 'adminToken=xyz789; path=/admin;');
这样设置后,adminToken
只能在 /admin
及其子路径(如 /admin/settings
)下被访问。
SameSite
encode
和decode
default
watch
示例1:
示例2:
API路由中的Cookies
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:useCookie函数:管理SSR环境下的Cookie | cmdragon's Blog
往期文章归档:
- 轻松掌握useAsyncData获取异步数据 | cmdragon's Blog
- 使用
useAppConfig
:轻松管理应用配置 | cmdragon's Blog - Nuxt框架中内置组件详解及使用指南(五) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(四) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(三) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(二) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(一) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(十一) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(十) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(九) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(八) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(七) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(六) | cmdragon's Blog
- Nuxt3 的生命周期和钩子函数(五) | cmdragon's Blog
useCookie函数:管理SSR环境下的Cookie的更多相关文章
- qt 环境下mapx组件的鼠标跟踪
经过两天的研究mapx组件人坐标转换还是没有转换成功,因为不管怎么变,定点转换的经纬度坐标始终与期望的值有较大的偏差.最后还是想老大请教了一下,划了半天功夫就研究出来了(不愧是老大,仰慕之情犹如滔滔江 ...
- redis内存分配管理与集群环境下Session管理
##################内存管理############### 1.Redis的内存管理 .与memcache不同,没有实现自己的内存池 .在2..4以前,默认使用标准的内存分配函数(li ...
- 分布式环境下的session管理
一.分布式Session的几种实现方式 1.1.基于cookie 进行session共享 简单.方便,每次通过判断cookie中的用户状态信息判断用户的登录状态:但是用户信息要存在客户端,存在安全隐患 ...
- 集群环境下,Session管理的几种手段
集群环境下,Session管理的几种手段 1.Session复制 缺点:集群服务器间需要大量的通信进行Session复制,占用服务器和网络的大量资源. 由于所有用户的Session信息在每台服务器上都 ...
- 【OGG】 RAC环境下管理OGG的高可用 (五)
[OGG] RAC环境下管理OGG的高可用 (五) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道 ...
- redis 与java的连接 和集群环境下Session管理
redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html) 第一步: a) 搭建环境 引入 jedis jar包 co ...
- 集群环境下的Session管理
1. 集群环境下的管理HTTPSSession所遇到的问题 一台服务器对应这个一个session对象,无法在另外一个服务器互通 解决方法: 1. Session 的 Replication(复制)将当 ...
- Linux环境下R和R包安装及其管理
前言 R对windows使用很友好,对Linux来说充满了敌意.小数据可以在windows下交互操作,效果很好很棒.可是当我们要处理大数据,或者要在集群上搭建pipeline时,不得不面对在Linux ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- 【转】Oracle RAC 环境下的连接管理
文章转自:http://www.oracle.com/technetwork/cn/articles/database-performance/oracle-rac-connection-mgmt-1 ...
随机推荐
- 一种利用光电容积描记(PPG)信号和深度学习模型对高血压分类的新方法
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI 据世界心脏联合会统计,截至 2022 年,全球有 13 亿人被诊断患有高血压,每年约有 1000 万人死 ...
- 2023年的Clion内建立多个子项目(保姆级教程)
目录 下载插件C/C++ Single File Execution 项目操作 其他操作 下载插件C/C++ Single File Execution 项目操作 1.新建项目-->如图所示操作 ...
- JSON返回结果修改null为"";json字段为null时输出空字符串
简介 (Introduction): 背景 json字符串返回的需要"",但是却是null,怎么处理呢,如下 结构图 1 [ 2 { 3 "1":{ 4 &qu ...
- Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?
@Autowired和@Resource都是Java Spring框架中的注解,用于实现依赖注入(DI)和控制反转(IoC).它们的区别主要在以下三个方面: 源头不同 @Autowired是Spri ...
- .net core DataTable.Load()方法,返回的行缺少,少于reader读出的行
我分析的原因是,datatable模式的schema默认是根据查询的sql来的.起因是我写的sql中带有主键的列,查出来有很多重复值, 然后dt.load会默认把主键重复的行给合并掉,所以最终查询出来 ...
- 【BI 可视化插件】怎么做? 手把手教你实现
背景 对于现在的用户来说,插件已经成为一个熟悉的概念.无论是在使用软件. IDE 还是浏览器时,插件都是为了在原有产品基础上提供更多更便利的操作.在 BI 领域,图表的丰富性和对接各种场景的自定义是最 ...
- 腾讯蓝鲸平台部署v5.1版本[去坑]
腾讯蓝鲸平台部署 1. 环境准备 #1. 基础优化 ulimit -SHn 655360 yum remove mysql-devel -y && yum install mysql- ...
- 一文教你在MindSpore中实现A2C算法训练
本文分享自华为云社区<MindSpore A2C 强化学习>,作者:irrational. Advantage Actor-Critic (A2C)算法是一个强化学习算法,它结合了策略梯度 ...
- Spring Data JPA 学习笔记1 - JPA与Spring Data
标记[跳过]的未来完善 1 理解JPA 1.1 什么是持久化? 当一个软件关闭的时候,软件内储存的状态数据还能在下次开启时被恢复,这就是持久化.对象持久化是指每个独立的对象的生命周期都能不依赖应用程序 ...
- element table根据条件隐藏复选框
在<el-table>标签加 :cell-class-name="cellClass" 在 <el-table-column type="selecti ...