深入理解浏览器的 Cookie:全面解析与实践指南
在现代 Web 开发中,Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好,还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富,Cookie 的使用和管理也日趋复杂,如何在保障用户体验的同时又保证数据安全、遵循隐私保护要求,成为开发者必须面对的难题。本文将从六大部分全面解析 Cookie 的各个层面,从基础概念到实际应用、从底层原理到安全防护措施,力求为读者提供一份详尽的参考资料。
第一部分:Cookie 的定义与背景
1.1 Cookie 的基本概念
Cookie 是指服务器通过 HTTP 响应头发送到用户浏览器的一段小型文本数据,该数据会被浏览器保存在本地。其核心作用在于记录用户的状态信息,从而使服务器能够识别用户的身份、维护用户会话、记录用户行为以及个性化定制页面等。
在没有 Cookie 之前,HTTP 协议被设计为无状态协议,也就是说每一次 HTTP 请求都是独立的、互不关联的请求。服务器无法辨识出连续的请求是否来自同一客户端,也就无法实现登录状态、购物车保存、跨页面数据共享等功能。而 Cookie 的出现,正是为了解决这一问题,为 Web 应用提供了一种在客户端和服务器之间传递状态信息的机制。
1.2 HTTP 协议的无状态性与 Cookie 的诞生
HTTP 协议天生的无状态性决定了服务器无法在多个请求之间保存客户端信息。举个例子:用户每次访问页面时,服务器都会视为一次全新的请求,这就导致了例如用户登录后状态丢失、购物车数据丢失等问题。
为了让服务器能够“记住”用户的信息,Netscape 公司于 1994 年提出了 Cookie 技术。最初的 Cookie 仅用于解决用户会话管理的问题,后来随着应用需求的不断扩大,Cookie 的作用逐渐扩展到个性化设置、行为追踪、广告定向以及安全防护等方面。可以说,Cookie 的出现让 HTTP 协议从一个无状态的通信协议转变为能够“记忆”的通信机制,大大丰富了 Web 应用的交互性和用户体验。
1.3 Cookie 的发展历程与标准化
从最初的简单会话管理到现在的复杂应用,Cookie 技术经历了多次演进和标准化过程:
-
早期应用: 最初仅用于保存简单的用户状态信息,例如登录状态或页面偏好设置。
-
RFC 标准: 随后随着互联网应用的普及,Cookie 逐渐被纳入 RFC(Request for Comments)标准中,相关标准不断完善,明确了 Cookie 的格式、传输规则以及安全要求。
-
现代浏览器支持: 当前主流浏览器都对 Cookie 提供了较为完善的支持,并针对跨站请求、第三方 Cookie 等问题引入了更多的限制和新属性(如 SameSite),以提高安全性和隐私保护。
通过下图直观理解 Cookie 从诞生到发展的历程:
通过以上背景介绍,我们已经对 Cookie 的基本概念、起源和发展有了初步认识。接下来,我们将详细探讨 Cookie 的工作原理。
第二部分:Cookie 的工作原理
Cookie 的工作机制主要涵盖三个阶段:创建、存储和传输。每个阶段都有其独特的技术细节和实现方式。
2.1 Cookie 的创建过程
当用户第一次访问某个网站时,服务器会在响应中通过 Set-Cookie 头向浏览器发送 Cookie。下面是一个简单的 HTTP 响应头示例:
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: sessionId=abc123; Path=/; Expires=Wed, 21 Apr 2025 12:00:00 GMT; HttpOnly; Secure; SameSite=Lax
在这个示例中:
-
sessionId=abc123
表示 Cookie 的名称为 sessionId,其值为 abc123。 -
Path=/
表示该 Cookie 对整个网站均有效。 -
Expires
属性设置了 Cookie 的过期时间,超过此时间后 Cookie 将被浏览器删除。 -
HttpOnly
属性指示该 Cookie 不能被 JavaScript 访问,从而防止通过脚本窃取 Cookie。 -
Secure
属性要求该 Cookie 只能在 HTTPS 环境下传输,确保数据传输的加密安全性。 -
SameSite
属性用于限制跨站请求时 Cookie 的发送,减少 CSRF 攻击风险。
服务器在发送 Cookie 时,可以根据需要设置多个属性,以确保 Cookie 的生命周期、作用范围和安全性满足业务需求。
2.2 Cookie 的存储机制
当浏览器接收到 Set-Cookie
响应头后,会解析并存储 Cookie。不同浏览器可能在存储结构上有所不同,但大体上会遵循以下原则:
-
持久性存储: 如果 Cookie 设置了
Expires
或Max-Age
属性,则会保存在硬盘上,直到达到过期时间。 -
会话存储: 如果没有设置有效期,则 Cookie 仅在当前会话中有效,当浏览器关闭时会自动删除。
-
域与路径匹配: 浏览器会根据 Cookie 中的
Domain
与Path
属性,决定哪些请求需要携带对应的 Cookie。
2.3 Cookie 的传输过程
在用户与服务器的每一次 HTTP 请求中,浏览器都会检查本地存储的 Cookie,并根据请求的 URL、域、路径等信息判断哪些 Cookie 应该被发送。典型的 Cookie 传输格式如下:
GET /user/profile HTTP/1.1
Host: example.com
Cookie: sessionId=abc123; lang=zh-CN
服务器接收到请求后,就可以从 Cookie 中读取用户的身份标识、偏好设置等数据,实现会话管理、个性化展示等功能。
2.4 Cookie 生命周期管理
Cookie 的生命周期主要由以下两个属性控制:
-
Expires: 直接指定一个固定的过期时间(GMT 格式)。
-
Max-Age: 指定 Cookie 从创建时开始到失效的秒数。
当这两个属性都未设置时,Cookie 将默认为会话级别,即浏览器关闭后删除。开发者可以根据业务需求选择合适的策略,确保 Cookie 数据既不过早丢失,也不会长时间存在于用户设备上。
2.5 工作流程示意图
通过上述流程图,我们可以直观地看到 Cookie 在客户端与服务器之间如何传递、如何帮助实现会话状态的维持。
第三部分:Cookie 的属性详解
Cookie 的各项属性决定了其使用场景、安全性以及对跨站请求的影响。在这部分,我们将详细讨论各个属性的具体作用和配置建议。
3.1 Name=Value 键值对
最基本的 Cookie 格式就是由键值对组成。例如:
Set-Cookie: userId=123456789
这里的userId
是 Cookie
的名称,而 123456789
是对应的值。开发者通常会将用户的会话标识、偏好设置等数据以键值对的形式存储在 Cookie 中。
3.2 Expires 与 Max-Age
- Expires
用法: 指定 Cookie 的绝对过期时间,格式为 GMT 时间字符串。
示例: Expires=Wed, 21 Apr 2025 12:00:00 GMT
注意: 如果客户端的时钟不准确,可能会导致 Cookie 失效的时间不如预期。
- Max-Age
用法: 指定 Cookie 从创建开始到失效的时间间隔,单位为秒。
示例: Max-Age=3600
表示该 Cookie 在创建后一小时内有效。
两者通常只能选其一,现代浏览器支持 Max-Age 优先于 Expires。
3.3 Domain 与 Path
- Domain
用法: 定义哪些域名可以接收该 Cookie。例如设置 Domain=example.com
后,example.com 以及其所有子域(如 www.example.com、sub.example.com)均可接收该 Cookie。
注意: 域设置不当可能会导致安全问题,建议仅在必要时设置。
- Path
用法: 限定 Cookie 发送的 URL 路径。
示例: Path=/admin
表示 Cookie 仅在访问 /admin 路径下的页面时携带。
通过细化路径,开发者可以实现更精确的 Cookie 作用范围控制。
3.4 Secure 与 HttpOnly
- Secure
用法: 设置该属性后,Cookie 仅在 HTTPS 连接中传输,避免在明文传输时被窃取。
示例: 在配置登录 Cookie 时,建议总是加上 Secure 属性,以确保传输安全。
- HttpOnly
用法: 设置该属性后,Cookie 将无法通过 JavaScript 的 document.cookie 进行访问,从而有效防范 XSS 攻击。
注意: 虽然 HttpOnly 能提高安全性,但也会限制一些客户端脚本对 Cookie 的读取操作。
3.5 SameSite 属性
SameSite 属性用于限制第三方请求携带 Cookie,主要防范 CSRF 攻击。其取值有三个:
-
Strict: 完全禁止第三方请求发送 Cookie,只有同站请求时 Cookie 才会发送。
-
Lax: 在一定条件下允许第三方请求发送 Cookie,例如 GET 请求跳转时允许。
-
None: 不限制 Cookie 的发送,但必须与 Secure 属性配合使用。
通过合理设置 SameSite 属性,可以在兼顾用户体验和安全性之间达到平衡。
3.6 属性配置实例
下面是一段配置 Cookie 的完整代码示例(以 Node.js 为例):
const express = require('express');
const app = express();app.get('/login', (req, res) => {// 模拟用户登录成功后,设置 Cookie 保存会话标识res.cookie('sessionId', 'abc123', {maxAge: 3600 * 1000, // Cookie 有效期 1 小时httpOnly: true, // 防止脚本访问secure: true, // 仅在 HTTPS 下传输sameSite: 'Lax', // 跨站请求条件下限制 Cookie 发送path: '/', // 整个站点均有效domain: 'example.com' // 限定在 example.com 及子域});res.send('登录成功,Cookie 已设置');
});app.listen(3000, () => {console.log('Server is running on https://localhost:3000');
});
第四部分:Cookie 的使用场景
Cookie 在实际开发中有着非常广泛的应用,下面详细介绍常见的使用场景及其实现方式。
4.1 会话管理与身份认证
最常见的应用场景是会话管理。用户登录后,服务器生成一个唯一的会话标识(session id),并将其存储在 Cookie 中。之后,浏览器在每次请求时自动带上这个标识,服务器便能识别出当前用户的身份。
4.1.1 实战案例:用户登录状态维护
假设一个电商网站需要维护用户的登录状态,当用户成功登录后,服务器会生成一个会话 ID 并写入 Cookie。下图展示了一个简单的会话管理流程:
服务器根据 Cookie 中的 sessionId 判断用户是否已登录,从而返回相应的页面或数据。
4.1.2 Session Fixation 与防御措施
除了基本的会话管理,Cookie 还可能遭遇 Session Fixation 攻击。攻击者诱导用户使用一个已知的 sessionId 登录,然后利用这个 sessionId 伪装成用户进行操作。为防御此类攻击,开发者应在用户登录后及时重置 sessionId,并结合 HttpOnly、Secure、SameSite 属性提高安全性。
4.2 个性化设置与用户偏好
现代网站往往需要记住用户的偏好设置,如主题、语言、字体大小等。通过 Cookie 存储这些信息,可以在用户每次访问时自动加载个性化配置。例如:
-
语言设置: 根据 Cookie 中记录的语言偏好,加载对应的本地化资源。
-
主题选择: 记录用户选择的浅色或深色主题,自动应用于页面布局。
4.2.1 实战案例:主题切换与记忆
在前端应用中,开发者可以通过读取 Cookie 中的设置来决定页面样式:
// 检查是否存在用户主题设置
const theme = document.cookie.match(/theme=(\w+)/)?.[1] || 'light';
document.documentElement.setAttribute('data-theme', theme);// 当用户点击主题切换按钮时
document.getElementById('theme-toggle').addEventListener('click', () => {const newTheme = theme === 'light' ? 'dark' : 'light';document.cookie = `theme=${newTheme}; path=/; max-age=31536000`;document.documentElement.setAttribute('data-theme', newTheme);
});
通过这种方式,用户在刷新页面或重新访问时,依然能够保持其所选主题。
4.3 行为追踪与个性化推荐
许多网站利用 Cookie 记录用户浏览轨迹,从而分析用户行为并提供个性化推荐。例如,电商平台会根据用户浏览的商品、购买历史、搜索关键词等信息,向用户推荐相关产品或促销活动。虽然此类应用可以提升用户体验,但也涉及到隐私和数据保护问题,因此需要谨慎处理。
4.3.1 数据统计与分析
通过 Cookie 收集用户行为数据后,服务器可以结合日志、数据库进行综合分析。常见的做法包括:
-
页面访问统计: 记录用户在各个页面的停留时间、点击次数等。
-
漏斗分析: 追踪用户从浏览、加入购物车到最终下单的转化路径。
-
热力图分析: 结合 Cookie 与 JavaScript 事件追踪,生成用户点击和滑动的热力图,为页面优化提供数据支持。
4.4 广告投放与第三方 Cookie
广告商往往依赖第三方 Cookie 来跨网站追踪用户行为,从而实现精准广告投放。第三方 Cookie 不仅可以在同一网站内部使用,也能在多个站点间共享数据。不过,由于隐私法规(如 GDPR、CCPA)和浏览器厂商的限制(如 Chrome 逐步淘汰第三方 Cookie),这一领域正面临较大调整。
4.4.1 广告投放流程示意
下图展示了第三方 Cookie 在广告投放中的工作流程:
广告平台通过 Cookie 识别用户兴趣,实现精准广告投放,但同时也引发了广泛的隐私争议和法规审查。
第五部分:Cookie 的安全性与隐私问题
尽管 Cookie 在功能上十分强大,但其固有的设计和实现也带来了不少安全性与隐私保护方面的隐患。本文将在此部分详细讨论 Cookie 可能面临的安全风险、隐私问题以及应对策略。
5.1 安全性问题
5.1.1 XSS(跨站脚本攻击)
跨站脚本攻击(XSS)是指攻击者在网页中注入恶意 JavaScript 代码,从而窃取 Cookie 或操控用户会话。由于 Cookie 中可能存储着用户身份信息、会话 ID 等敏感数据,一旦被窃取,攻击者便可能伪装成用户进行非法操作。
防范措施:
-
使用 HttpOnly 属性: 通过设置 Cookie 的 HttpOnly 属性,使得 JavaScript 无法读取 Cookie,从根本上阻断 XSS 攻击窃取 Cookie 的途径。
-
输入过滤和输出编码: 在处理用户输入时,严格过滤和编码特殊字符,避免恶意脚本注入。
-
内容安全策略(CSP): 使用 CSP 头部限制外部脚本资源加载,降低 XSS 攻击的风险。
5.1.2 CSRF(跨站请求伪造)
CSRF 攻击利用用户当前已登录状态发起伪造请求,使得服务器误以为是用户主动操作。攻击者可以利用用户浏览器中自动携带的 Cookie 发起恶意请求。
防范措施:
-
SameSite 属性: 设置 Cookie 的 SameSite 属性(建议使用 Strict 或 Lax 模式)可以有效防止跨站请求时 Cookie 的自动发送,从而降低 CSRF 风险。
-
令牌机制: 在表单中引入 CSRF Token,每次请求都必须携带唯一的令牌,服务器验证后才处理请求。
-
双重验证: 对于关键操作(如转账、密码修改等),可要求用户二次确认或输入验证码。
5.1.3 会话劫持与固定(Session Hijacking & Fixation)
会话劫持指攻击者截获或预测到用户的会话标识,从而伪装成用户进行操作。会话固定则是攻击者预先设定一个已知的会话标识,并诱导用户使用该标识登录。
防范措施:
-
加密传输: 总是通过 HTTPS 协议传输 Cookie,防止中间人攻击。
-
定期更新会话 ID: 在用户登录成功后重置会话 ID,避免固定攻击。
-
使用短生命周期 Cookie: 合理设置 Cookie 的有效期,降低被劫持的风险。
5.2 隐私问题
5.2.1 第三方 Cookie 与用户追踪
第三方 Cookie 常被用于跨站追踪用户行为,进而建立用户画像并实现精准广告投放。尽管这在商业上具有一定价值,但也引起了用户对隐私泄露的广泛担忧。
应对策略:
-
浏览器限制: 现代浏览器(如 Safari、Chrome 等)逐步限制第三方 Cookie 的使用,并提供隐私保护模式。
-
法律法规: GDPR、CCPA 等隐私法规要求网站在使用 Cookie 前必须取得用户同意,并明确告知其用途。
-
透明告知: 网站应在隐私政策中详细说明 Cookie 的使用目的,并允许用户选择退出追踪。
5.2.2 Cookie 数据的存储与安全
Cookie 中可能包含敏感信息,如会话标识、用户偏好、购物车数据等。如果这些数据没有经过适当加密或访问控制,一旦被窃取,将给用户带来严重的安全隐患。
防范措施:
-
最小化存储: 仅在 Cookie 中存储必要信息,敏感数据尽量存放在服务器端,并通过加密进行保护。
-
安全策略: 在 Cookie 传输和存储时结合 Secure、HttpOnly、SameSite 等属性,全面提升数据安全性。
第六部分:Cookie 与其他存储技术的比较
除了 Cookie,前端开发中还常用其他本地存储方案,如 LocalStorage、SessionStorage、IndexedDB 等。不同存储方式在容量、生命周期、自动发送与安全性等方面各有优劣。下面我们进行详细对比:
6.1 Cookie
-
容量: 一般为 4KB 左右,受浏览器限制,每个域名最多存储 20~50 个 Cookie。
-
自动发送: 每次 HTTP 请求时,浏览器会自动将符合条件的 Cookie 发送到服务器。
-
生命周期: 可以通过 Expires 或 Max-Age 设置持久性;默认无设置则为会话级别。
-
安全性: 支持 HttpOnly、Secure、SameSite 等属性;但因每次请求均发送,可能造成带宽浪费。
-
使用场景: 适用于用户身份验证、会话管理、个性化设置以及跨站追踪等场景。
6.2 LocalStorage
-
容量: 一般为 5MB~10MB,比 Cookie 存储容量大得多。
-
自动发送: 不会自动随 HTTP 请求发送,完全由客户端 JavaScript 操作。
-
生命周期: 数据长期存在,除非主动清除或浏览器重置。
-
安全性: 容易受到 XSS 攻击,因为数据可以被脚本读取;不支持自动加密传输。
-
使用场景: 适用于存储非敏感的大量数据,如用户偏好、缓存数据、离线存储等。
6.3 SessionStorage
-
容量: 容量与 LocalStorage 相似,但存储的数据仅限于当前会话。
-
自动发送: 同样不会自动随 HTTP 请求发送,依赖客户端代码进行操作。
-
生命周期: 当浏览器标签页或窗口关闭时,数据自动清除。
-
安全性: 与 LocalStorage 类似,易受 XSS 攻击;但数据隔离性较好,不会在多个标签间共享。
-
使用场景: 适用于在单次会话内临时保存数据,如表单填写过程中的数据缓存。
6.4 IndexedDB
-
容量: 容量较大,可存储大量结构化数据。
-
自动发送: 仅供客户端 JavaScript 读取,不参与 HTTP 请求。
-
生命周期: 长期存在,除非主动删除数据。
-
安全性: 支持较复杂的数据存储和检索,安全性依赖于应用设计;同样存在 XSS 风险。
-
使用场景: 适合存储需要离线使用的应用数据、较复杂的应用状态以及大数据量的缓存。
6.5 各存储技术优劣总结
存储方式 | 容量 | 自动发送 | 生命周期 | 安全性 | 典型用途 |
---|---|---|---|---|---|
Cookie | 约 4KB | ✔️ | 可设定 / 会话级 | 可设 HttpOnly | 会话管理、用户身份验证、跨站追踪 |
LocalStorage | 5~10MB | ❌ | 永久 | 易被脚本读取 | 用户偏好、缓存数据、离线存储 |
SessionStorage | 5MB | ❌ | 会话内有效 | 易被脚本读取 | 临时表单数据、会话级状态保存 |
IndexedDB | 数十MB甚至更高 | ❌ | 永久 | 依赖应用设计 | 离线应用、大数据量存储、复杂查询 |
6.6 存储选择的实际考量
在实际开发中,如何选择合适的存储方案取决于多个因素:
-
数据敏感性: 敏感信息应存储在服务器端,并使用安全的 Cookie(结合 HttpOnly 和 Secure)传递;非敏感信息可存储在 LocalStorage 或 IndexedDB 中。
-
数据量大小: 数据量较小时使用 Cookie 更方便;大量数据则应考虑 LocalStorage 或 IndexedDB。
-
使用场景: 如果需要服务器每次请求都能获取数据,Cookie 是首选;如果数据仅用于客户端显示或逻辑处理,则建议使用 LocalStorage/SessionStorage,避免额外的网络开销。
总结
本文详细解析了浏览器 Cookie 的各个方面,内容覆盖了从基础定义到工作原理、从属性详解到实际使用场景,再到安全性、隐私问题和与其他存储技术的综合对比。总体而言,Cookie 是 Web 应用中实现状态管理与用户识别的重要技术手段。虽然随着技术发展,其他存储技术也不断涌现,但 Cookie 依然在用户身份认证、会话管理以及个性化设置中具有不可替代的作用。
附录:更多实战案例与代码示例
附录一:基于 Cookie 的用户登录示例(Node.js 与 Express)
下面是一段完整的用户登录示例代码,展示了如何在用户登录后设置 Cookie,并在后续请求中读取 Cookie 以判断用户身份:
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();// 使用 cookie-parser 中间件解析 Cookie
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));// 模拟用户数据库
const users = {'user1': { password: 'password1', name: '张三' },'user2': { password: 'password2', name: '李四' }
};// 登录接口
app.post('/login', (req, res) => {const { username, password } = req.body;const user = users[username];if (user && user.password === password) {// 登录成功,设置 Cookieres.cookie('sessionId', username + '_session_' + Date.now(), {maxAge: 3600000, // 1 小时有效httpOnly: true,secure: true,sameSite: 'Lax',path: '/',domain: 'example.com'});res.send(`欢迎 ${user.name} 登录成功!`);} else {res.status(401).send('用户名或密码错误');}
});// 受保护资源接口
app.get('/profile', (req, res) => {const sessionCookie = req.cookies.sessionId;if (sessionCookie) {// 此处仅为示例,实际项目应校验 sessionCookie 是否有效res.send(`用户资料,当前会话标识:${sessionCookie}`);} else {res.status(401).send('请先登录');}
});app.listen(3000, () => {console.log('Server running on https://localhost:3000');
});
附录二:前端 Cookie 操作示例(JavaScript)
在前端如何读取、设置和删除 Cookie 也是常见的需求,下面是一个简单的示例:
// 设置 Cookie
function setCookie(name, value, days) {const d = new Date();d.setTime(d.getTime() + (days*24*60*60*1000));const expires = "expires="+ d.toUTCString();document.cookie = `${name}=${value}; ${expires}; path=/`;
}// 读取 Cookie
function getCookie(name) {const cname = name + "=";const decodedCookie = decodeURIComponent(document.cookie);const ca = decodedCookie.split(';');for(let c of ca) {c = c.trim();if (c.indexOf(cname) === 0) {return c.substring(cname.length, c.length);}}return "";
}// 删除 Cookie
function deleteCookie(name) {document.cookie = name+'=; Max-Age=-99999999;';
}// 示例操作
setCookie('theme', 'dark', 365);
console.log('当前主题:', getCookie('theme'));
deleteCookie('theme');
附录三:跨站请求中的 Cookie 控制(SameSite 实例)
为防止 CSRF 攻击,开发者可以通过配置 SameSite 属性来限制跨站请求携带 Cookie,以下为一个示例说明:
// 假设我们有一个 API 需要防范跨站请求
app.post('/transfer', (req, res) => {// 只有在同站请求时,Cookie 才会自动携带// 同时配合 CSRF Token 进一步提高安全性if (req.cookies.sessionId && req.body.csrfToken === req.session.csrfToken) {// 执行转账操作res.send('转账成功');} else {res.status(403).send('请求非法');}
});
相关文章:
深入理解浏览器的 Cookie:全面解析与实践指南
在现代 Web 开发中,Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好,还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富,Cookie 的使用和管理也日趋复杂,如何在保障…...
浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek人文艺术之美专场来啦!
浙江大学DeepSeek系列专题线上公开课第二季第五期即将重磅上线! 其中,今晚7点半,浙大AI大神陈为教授将带来硬核的deepseek公开课讲座。 讲座 主题: DeepSeek时代,让AI更懂中国文化的美与善 主讲人: 陈为 …...
5分钟学会接口自动化测试框架
今天,我们来聊聊接口自动化测试。 接口自动化测试是什么?如何开始?接口自动化测试框架如何搭建? 自动化测试 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发…...
Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程
在前面的文章中Flink 编程基础:Scala 版 DataStream API 入门-CSDN博客,我们已经介绍了 Flink 的 Datastream API 编程模型、窗口划分以及时间语义(处理时间、事件时间等)。本篇文章将深入讲解窗口计算的进阶内容,包括…...
【从零实现高并发内存池】内存池整体框架设计 及 thread cache实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
#MES系统中的一些相关的名词
📌MES系统 部分 术语表 缩写英文全称中文名称详细解释MESManufacturing Execution System制造执行系统用于连接计划系统与生产现场,实时管理和控制整个生产过程,覆盖物料、人员、设备、质量、指令等。ERPEnterprise Resource Planning企业资…...
《灵活的接口设计:如何支持多种后端数据存取实现》
《灵活的接口设计:如何支持多种后端数据存取实现》 一、引言:从单一适配到多样需求 在现代软件开发中,系统通常需要与不同的数据存储后端进行交互,例如关系型数据库(MySQL、PostgreSQL)、NoSQL 数据库(MongoDB、Redis)或文件存储(JSON、CSV)。为了增强系统的可扩展性…...
Spark-SQL核心编程(一)
一、Spark-SQL 基础概念 1.定义与起源:Spark SQL 是 Spark 用于结构化数据处理的模块,前身是 Shark。Shark 基于 Hive 开发,提升了 SQL-on-Hadoop 的性能,但因对 Hive 依赖过多限制了 Spark 发展,后被 SparkSQL 取代&…...
Qt:解决MSVC编译器下qDebug输出中文乱码的问题
问题描述: 使用msvc编译器,通过qDebug输出打印信息为乱码(显示问号或者乱码) 百度到以下方案,但是没有效果 最终解决: 在.pro文件中添加如下,重新构建运行即可显示中文内容 msvc:QMAKE_CXXFLAGS -exec…...
Go:接口
接口既约定 Go 语言中接口是抽象类型 ,与具体类型不同 ,不暴露数据布局、内部结构及基本操作 ,仅提供一些方法 ,拿到接口类型的值 ,只能知道它能做什么 ,即提供了哪些方法 。 func Fprintf(w io.Writer, …...
js | 网页上的 json 数据怎么保存到本地表格中?
1.思路 json 转为 csv 保存到本地或者:json 转为 html 显示到网页中,然后复制到excel中。 (2) 数据 wjl{"code":1,"data":[{"chrmiRNA":"chr1","0":"chr1","startmiRNA":&quo…...
智能Todo协作系统开发日志(二):架构优化与安全增强
📅 2025年4月14日 | 作者:Aphelios380 🌟 今日优化目标 在原Todo单机版基础上进行三大核心升级: 组件化架构改造 - 提升代码可维护性 本地数据加密存储 - 增强隐私安全性 无障碍访问支持 - 践行W3C标准 一、组件化架构改造 …...
buctoj_算法设计与分析(5)
问题 A: 没有上司的舞会 题目描述 Ural大学有N名职员,编号为1~N。 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。 每个职员有一个快乐指数,用整数 HiHi 给出,其中 1≤i≤N。 现在要召开一场周年庆宴会&#x…...
VUE项目中的package.json中的启动脚本
"scripts": {"dev": "vite","build:prod": "vite build","build:stage": "vite build --mode staging","preview": "vite preview"}vite build 和 vite build --mode staging 是 V…...
目标追踪数据标注
在将 YOLO(目标检测) 和 DeepSORT(目标追踪) 结合时,数据标注需要同时满足 检测 和 追踪 的需求。以下是具体的分阶段标注策略和操作指南: 一、标注的核心要求 检测标注:每帧中目标的 边界框&a…...
详细介绍7大排序算法
1.排序的概念及其运用 1.1 排序的概念 排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记…...
TGCTF web
AAA偷渡阴平 这个题是一个非预期的无参RCE <?php$tgctf2025$_GET[tgctf2025];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $tgctf2025)){//hi…...
RTPS数据包分析
DDS-RTPS 常见子消息_dds pdp消息-CSDN博客Fast RTPS原理与代码分析(3):动态发现协议之端点发现协议EDP_fast-rtps 原理-CSDN博客 在RTPS(Real-Time Publish-Subscribe,实时发布订阅)协议中,DATA(r)和DATA是两种不同的…...
go语言gRPC使用流程
1. 安装工具和依赖 安装 Protocol Buffers 编译器 (protoc) 下载地址:https://github.com/protocolbuffers/protobuf/releases 使用说明:https://protobuf.dev/ 【centos环境】yum方式安装:protoc[rootlocalhost demo-first]# yum install …...
回溯算法的要点
可以用树结构(解空间树)来表示用回溯法解决的问题的所有选项。 叶节点则对应着最终的状态. 回溯过程:深度遍历,在任意时刻,算法只保存从根结点到当前结点的路径。 “剪枝”:当某一节点不包含问题的解&am…...
爬虫: 一文掌握 pycurl 的详细使用(更接近底层,性能更高)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、PycURL概述1.1 PycURL介绍1.2 基本安装1.3 安装依赖(Linux/macOS)1.4 常用选项参考二、基本使用2.1 简单 GET 请求2.2 获取响应信息2.3 设置请求头2.4 超时设置2.5 跟随重定向三、高级功能3.1 POST 请求3.2 文件上…...
大模型文生图
提示词分4个部分:质量,主体,元素,风格 质量:杰作,高质量,超细节,完美的精度,高分辨率,大师级的; 权重:把图片加括号,&am…...
c# AI编程助手 — Fitten Code
前言 前有Copilot各种酷炫操作,今有国产软件杀出重围。给大家介绍的是一款国内的国产编程神器,可与微软GitHub Copilot比比身手。关键它还是完全免费。它就是:非十团队国产自主研发的Fitten Code。此工具的速度是GitHub Copilot的两倍&#x…...
《植物大战僵尸融合版v2.4.1》,塔防与创新融合的完美碰撞
《植物大战僵尸融合版》是基于经典塔防游戏《植物大战僵尸》的创意同人改版,由“蓝飘飘fly”等开发者主导制作。它在保留原版核心玩法的基础上,引入了独特的植物融合机制,玩家可以将不同的植物进行组合,创造出全新的植物种类&…...
深度学习总结(12)
层:深度学习的基础模块 神经网络的基本数据结构是层。层是一个数据处理模块,它接收一个或多个张量作为输入,并输出一个或多个张量。有些层是无状态的,但大多数层具有状态,即层的权重。权重是利用随机梯度下降学到的一个或多个张量…...
pyqt环境配置
文章目录 1 概述2 PyQt6和PySide6区别3 环境配置4 配置PySide65 配置PyQt66 配置外部工具7 添加模板8 使用pyside6-project构建工程9 常见错误10 相关地址 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 …...
YOLO11改进——融合BAM注意力机制增强图像分类与目标检测能力
深度学习在计算机视觉领域的应用取得了显著进展,尤其是在目标检测(Object Detection)和图像分类(Image Classification)任务中。YOLO(You Only Look Once)系列算法凭借其高效的单阶段检测框架和…...
考研单词笔记 2025.04.14
amount n数量,数额v(数量)达到,总计(to),意味着,相当于 couple n一对,一双,一些,几个,夫妻,情侣v连接,结合 …...
AI云游戏盒子:未来娱乐的新纪元
AI云游戏盒子:未来娱乐的新纪元 随着科技的不断进步,人工智能(AI)与云计算技术的结合正在重新定义我们享受数字娱乐的方式。2025年,一款名为“AI云游戏盒子”的产品正逐渐成为家庭娱乐的核心设备,它不仅集…...
第八章 文件操作
第八章 文件操作 文章目录 第八章 文件操作1 文件读取1 将文件整个读取内存2 按字节读取文件 1 文件读取 1 将文件整个读取内存 类似于python的 with open(filename, modert, encodingutf-8) as f:res f.read()go中的书写方式: 方式一: package ma…...
《extern:如何在编译时“暗通款曲“》
C中extern关键字的完整用法总结 extern是C中管理链接性(linkage)的重要关键字,主要用于声明外部定义的变量或函数。以下是详细的用法分类和完整示例: 一、基本用法 1. 声明外部全局变量 // globals.cpp int g_globalVar 42; …...
活动图与流程图的区别与联系:深入理解两种建模工具
目录 前言1. 活动图概述1.1 活动图的定义1.2 活动图的基本构成要素1.3 活动图的应用场景 2. 流程图概述2.1 流程图的定义2.2 流程图的基本构成要素2.3 流程图的应用场景 3. 活动图与流程图的联系4. 活动图与流程图的区别4.1 所属体系不同4.2 表达能力差异4.3 使用目的与语境4.4…...
FinanceRAG获奖方案解读:ACM-ICAIF ’24的FinanceRAG挑战赛
ACM-ICAIF 24 FinanceRAG Challenge提供一套整合的文本和表格财务数据集。这些数据集旨在测试系统检索和推理财务数据的能力。参与者将受益于 Github 上的基线示例和官方提交代码,其位于FinanceRAG,以及在 huggingface 上的简化的数据集访问,…...
Linux LED驱动(gpio子系统)
0. gpio子系统 gpio子系统是linux内核当中用于管理GPIO资源的一套系统,它提供了很多GPIO相关的API接口,驱动程序中使用GPIO之前需要向gpio子系统申请。 gpio子系统的主要目的就是方便驱动开发者使用gpio,驱动开发者在设备树中添加gpio相关信息…...
场外期权交易和结算方式的区别是什么?
场外期权交易的核心在于双方协商一致的合约条款。这些条款包括但不限于期权的类型(看涨或看跌)、执行价格、到期日、合约规模以及支付的期权费。由于每份合约都是独一无二的,因此交易双方需要具备高度的专业知识和谈判技巧,下文为…...
自注意力的机制内涵和设计逻辑
在自注意力机制中,查询(Q)、键(K)和值(V)的交互过程是核心设计,其背后的数学和语义内涵可以从以下角度理解: 1. 数学视角:动态加权聚合 自注意力机制的公式可…...
VIM学习笔记
1. ex模式 vim中,按:触发的命令行模式,称为 ex模式,具体命令参见如下笔记: https://blog.csdn.net/u010250151/article/details/51868751?ops_request_misc%257B%2522request%255Fid%2522%253A%2522814b671a9898c95…...
Windows系统docker desktop安装(学习记录)
目前在学习docker,在网上扒了很多老师的教程,终于装好了,于是决定再装一遍做个记录,省的以后再这么麻烦 一:什么是docker Docker 是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个…...
操作系统学习笔记——[特殊字符]超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白!
💡超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白! 一、什么是阻塞?为什么线程会阻塞?二、socket线程被阻塞的典型场景🧠 解法思路: 三、线程的几种阻塞状…...
GIC驱动程序对中断的处理流程
承接上一篇,我们来讲讲GIC的处理流程: 我们先来看看老版本的CPU是怎么去处理中断的: 这种的话,基本上就是一开始就确定你有多少个中断,就为你分配好了多少个irq_desc,这样子每一个硬件中断,也就…...
罗庚机器人:机器人打磨领域的先行者
近日,记者在广东罗庚机器人有限公司(以下简称罗庚机器人)总经理蒲小平处了解到,该公司是一家研发与为客户提供高精度自适应机器人打磨抛光集成工艺的高科技企业,是机器人打磨领域的先行者。在国内外机器人打磨抛光应用…...
如何在 Java 中对 PDF 文件进行数字签名(教程)
Java 本身并不原生支持 PDF 文件,因此若要对 PDF 进行数字签名,您需要使用一些专用的软件。本教程将演示如何使用 JPedal PDF 库来对 PDF 文件进行数字签名。 步骤: • 下载 JPedal 并将 Jar 文件添加到项目中 • 创建一个 PKCS#12 密…...
一文了解:北斗短报文终端是什么,有哪些应用场景?
在通信技术飞速发展的今天,人们已习惯于依赖地面基站和互联网实现即时通信。然而,当自然灾害突发、远洋航行遇险或深入无人区勘探时,传统通信手段往往失效。北斗短报文终端——这一由中国自主研发的卫星通信技术,正以“无网络通信…...
【KWDB创作者计划】_KWDB应用之实战案例
【KWDB 2025 创作者计划】_KWDB应用之实战案例 本文是在完成KWDB数据库安装的情况下的操作篇,关于KWDB的介绍与安装部署,可以查看上一篇博客: https://blog.itpub.net/70045384/viewspace-3081187/ https://blog.csdn.net/m0_38139250/article/details/…...
JavaScript中的运算符与语句:深入理解编程的基础构建块
# JavaScript中的运算符与语句:深入理解编程的基础构建块 在JavaScript编程的世界里,运算符和语句就像是构建大厦的基石,它们是编写高效、灵活代码的基础。今天,我们就来深入了解一下这些重要的元素。 ## 一、运算符:…...
MySQL——学习InnoDB(1)
MySQL——学习InnoDB(1) 文章目录 MySQL——学习InnoDB(1)1. InnoDB的前世今生1.1 诞生发展1.2 核心设计1.3 关键进化 2. InnoDB和MyISAM在性能和安全上的区别2.1 性能对比2.2 安全对比 3. InnoDB架构图(内存结构磁盘结…...
QT中多线程写法
转自个人博客:QT中多线程写法 1. QThread及moveToThread() 使用情况: 多使用于需要将有着复杂逻辑或需要一直占用并运行的类放入子线程中执行的情况,moveToThread是将整个类的对象移入子线程。 优缺点: 优点:更符合…...
css 二维码始终显示在按钮的正下方,并且根据不同的屏幕分辨率自动调整位置
一、需求 “求职入口” 下面的浮窗位置在其正下方,并且浏览器分辨的改变(拖动浏览器),位置依旧在最下方 二、实现 <div class"btn_box"><div class"btn_link id"js-apply">求职入口<di…...
STM32 认识STM32
目录 什么是嵌入式? 认识STM32单片机 开发环境安装 安装开发环境 开发板资源介绍 单片机开发模式 创建工程的方式 烧录STM32程序 什么是嵌入式? 1.智能手环项目 主要功能有: 彩色触摸屏 显示时间 健康信息:心率&#…...
关于 CSDN的C知道功能模块 的详细解析,包括 新增的AI搜索(可选深度思考) 和 智能体功能 的具体说明及对比分析
以下是关于 CSDN的C知道功能模块 的详细解析,包括 新增的AI搜索(可选深度思考) 和 智能体功能 的具体说明及对比分析: 一、C知道核心功能模块详解(基础功能) (参考前文内容,此处略…...