深入理解浏览器的 Cookie:全面解析与实践指南

news2025/4/17 19:19:10

在现代 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 中的 DomainPath属性,决定哪些请求需要携带对应的 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

这里的userIdCookie 的名称,而 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会话管理、用户身份验证、跨站追踪
LocalStorage5~10MB永久易被脚本读取用户偏好、缓存数据、离线存储
SessionStorage5MB会话内有效易被脚本读取临时表单数据、会话级状态保存
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) {
    // 登录成功,设置 Cookie
    res.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('请求非法');
  }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 正则表达式综合实战:URL 匹配与源码解析

在 Web 应用开发中,我们经常需要对 URL 进行格式验证。今天我们结合 Java 的 Pattern 和 Matcher 类,深入理解正则表达式在实际应用中的强大功能,并剖析一段实际的 Java 示例源码。 package com.RegExpInfo;import java.util.regex.Matcher; …

【C++】前向声明(Forward Declaration)

前向声明(Forward Declaration)是在C、C等编程语言中,在使用一个类、结构体或其他类型之前,仅声明其名称而不给出完整定义的一种方式。 作用 减少编译依赖:当一个源文件包含大量头文件时,编译时间会显著增…

numpy.ma.masked_where:屏蔽满足条件的数组

1.函数功能 屏蔽满足条件的数组内容,返回值为掩码数组 2.语法结构 np.ma.masked_where(condition, a, copyTrue)3. 参数 参数含义condition屏蔽条件a要操作的数组copy布尔值,取值为True时,结果复制数组(原始数据不变),否则返回…

【解决】bartender软件换网之后神秘变慢

下的山寨版本bartender软件,用着一直都挺好,结果一次换网之后,启动,排版,打印各种动作都要转个几分钟才行,非常奇怪。直接说解决过程。 首先联想网络没有动以及脱机的时候,都没有这个问题。那么…

[福游宝——AI智能旅游信息查询平台]全栈AI项目-阶段二:聊天咨询业务组件开发

简言 本项目旨在构建一个以AI智能体为核心的福建省旅游信息查询系统,聚焦景点推荐、路线规划、交通天气查询等功能,为游客提供智能化、便捷化的旅游信息服务。项目采用前后端分离架构,前端基于Vite TypeScript Vue3技术栈,搭配…

【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图24图

背景需求: 用Python,对白色255背景的图片进行了透明化、制作点状或线段的描边裁剪线 【教学类-102-10】剪纸图案全套代码09——Python线条虚线优化版04(原图放大白背景)+制作1图2图6图24图-CSDN博客文章浏览阅读1k次,点赞27次,收藏8次。【教学类-102-10】剪纸图案全套代…

MCP的另一面

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

微信小程序 - swiper轮播图

官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html <swiper indicator-color"ivory" indicator-active-color"#d43c33" indicator-dots autoplay><swiper-item><image src"/images/banner…

2025年第十六届蓝桥杯省赛C++ 研究生组真题

2025年第十六届蓝桥杯省赛C 研究生组真题 1.说明2.题目A&#xff1a;数位倍数&#xff08;5分&#xff09;3.题目B&#xff1a;IPv6&#xff08;5分&#xff09;4.题目C&#xff1a;变换数组&#xff08;10分&#xff09;5.题目D&#xff1a;最大数字&#xff08;10分&#xff…

七、自动化概念篇

自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。在此过程中&#xff0c;为了节省人…

【第43节】实验分析windows异常分发原理

目录 前言 一、异常处理大致流程图 二、实验一&#xff1a;分析 KiTrap03 三、实验二&#xff1a;分析CommonDispatchException 四、代码探究&#xff1a;分析 KiDispatchException 函数 五、代码探究&#xff1a;伪代码分析用户层KiUserExceptionDispatcher 前言 在Wind…

如何在AMD MI300X 服务器上部署 DeepSeek R1模型?

DeepSeek-R1凭借其深度推理能力备受关注&#xff0c;在语言模型性能基准测试中可与顶级闭源模型匹敌。 AMD Instinct MI300X GPU可在单节点上高效运行新发布的DeepSeek-R1和V3模型。 用户通过SGLang优化&#xff0c;将MI300X的性能提升至初始版本的4倍&#xff0c;且更多优化将…

RTX 5060 Ti 3DMark跑分首次流出:比RTX 4060 Ti快20%

快科技4月14日消息&#xff0c;根据VideoCardz拿到的数据&#xff0c;RTX 5060 Ti 16GB在3DMark的系列基准测试中&#xff0c;平均较上一代RTX 4060 Ti 16GB高出20%。 具体来看&#xff0c;RTX 5060 Ti 16GB在3DMark的测试中表现如下&#xff1a; TimeSpy&#xff08;1440p&a…

【STL】set

在 C C C S T L STL STL 标准库中&#xff0c; s e t set set 是一个关联式容器&#xff0c;表示一个集合&#xff0c;用于存储唯一元素的容器。 s e t set set 中的元素会自动按照一定的顺序排序&#xff08;默认情况下是升序&#xff09;。这意味着在 s e t set set 中不能…

深入剖析C++中 String 类的模拟实现

目录 引言 一、基础框架搭建 成员变量与基本构造函数 析构函数 二、拷贝与赋值操作 深拷贝的拷贝构造函数 赋值运算符重载 三、字符串操作功能实现 获取字符串长度 字符串拼接 字符串比较 字符访问 四、迭代器相关实现&#xff08;简单模拟&#xff09; 迭代器类型…

STL之priority_queue的用法与实现

目录 1. priority_queue的介绍 1.1. priority_queue的概念 1.2. priority_queue的特点 2. 仿函数 2.1. 仿函数的概念 2.2. 仿函数的应用 2.3 仿函数的灵活性 3. priority_queue的用法 4. 模拟实现priority_queue 4.1. 插入 4.2. 删除 5. 源码 priority_…

散户使用算法交易怎么做?

智能算法交易是量化交易里面最常见的一种&#xff0c;也是大多数散户被套住的股票&#xff0c;想要解套&#xff0c;降低成本最直接有效的方式。但是往往这种波动速度小&#xff0c;担心速度跟不上的情况&#xff0c;我们就要叠加快速通道。 第一&#xff1a;算法交易的应用场…

mongodb 安装配置

1.官网下载地址&#xff1a;MongoDB Community Download | MongoDB 2.解压包安装&#xff1a;https://pan.baidu.com/s/1Er56twK9UfxoExuCPlJjhg 提取码: 26aj 3.配置环境&#xff1a; &#xff08;1&#xff09;mongodb安装包位置&#xff1a; &#xff08;2&#xff09;复…

榕壹云酒水定制系统:基于THinKPHP+MySQL+UniApp打造数字化时代的个性化购酒新体验

数字化浪潮下的酒水定制新机遇 在消费升级与个性化需求崛起的背景下,传统酒水行业正面临数字化转型的迫切需求。为此,我们团队基于ThinkPHP+MySQL+UniApp技术栈,开发了一套榕壹云酒水定制系统,旨在通过数字化手段解决消费者个性化购酒痛点,为酒类品牌提供全链路数字化解决…

Leetcode——137 260找出只出现一次的数

文章目录 找出只出现一次的数引入Leetcode 260Leetcode 137 找出只出现一次的数 对于数组中有一类题&#xff0c;即某些数据在数组中只出现一遍&#xff0c;需要我们找出&#xff0c;今天我们来看看这个类型的题。 引入 想必大家应该见过这么一道题&#xff1a; 现给定一个数…