深入理解浏览器的 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 中的 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) {// 登录成功,设置 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('请求非法');}
});

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

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

相关文章

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展,企业对GPU加速计算的需求愈加迫切。在此过程中,如何高效地配置宿主机与容器化环境,特别是利用NVIDIA GPU和相关工具&…

【秣厉科技】LabVIEW工具包——OpenCV 教程(19):拾遗 - imgproc 基础操作(上)

文章目录 前言imgproc 基础操作(上)1. 颜色空间2. 直方图3. 二值化4. 腐蚀、膨胀、开闭运算5. 梯度与轮廓6. 简易绘图7. 重映射 总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Windows系统&#x…

Linux 下 Module 工具的介绍与使用

参考: https://www.fasteda.cn/post/22.html https://modules.readthedocs.io/en/latest/module.html Linux 下 Module 工具的介绍与使用 一、前言 在 Linux 中,当同一款编辑器、运行库、软件存在多个版本且多个版本都需要在不同的场景或人员使用时&a…

空间信息可视化——WebGIS前端实例(一)

技术栈:原生HTML 源代码:CUGLin/WebGIS: This is a project of Spatial information visualization 4 全国贫困县可视化系统 4.1 系统设计思想 党的十九大报告明确指出,要“确保到2020年我国现行标准下农村贫困人口实现脱贫,贫困县全部摘帽,解决区域…

单双线程的理解 和 lua基础语法

1.什么是单进程 ,什么是多进程 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由单个或多个线程所组成的。 1.1 像apache nginx 这类 服务器中间件就是多进程的软件 &#xff0…

【Linux】VIM 编辑器,编辑加速引擎

目录 vim中的五种常见模式介绍VIM的基本操作安装VIMVIM中的模式切换 VIM指令集命令模式指令集底行模式指令集视图模式指令集替换和插入模式 end vim中的五种常见模式介绍 正常/普通/命令模式【Normal mode】 控制屏幕光标的移动,字符、字或行的删除,移动…

【Linux网络】Socket 编程TCP

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12891150.html 目录 TCP socket API 详解 socket(): bind(): listen(): accept(): connect V0…

记一次 .NET某固高运动卡测试 卡慢分析

一:背景 1. 讲故事 年前有位朋友找到我,说他们的程序会偶发性卡慢 10s 钟,在某些组合下会正常,某些组合下就会出现问题,解释不了其中的原因,让我帮忙看下怎么回事?截图如下: priva…

硬件知识积累 单片机+ 光耦 + 继电器需要注意的地方

1. 电路图 与其数值描述 1.1 单片机引脚信号为 OPtoCoupler_control_4 PC817SB 为 光耦 继电器 SRD-05VDC-SL-A 的线圈电压为 67Ω。 2. 需注意的地方 1. 单片机的推挽输出的电流最大为 25mA 2. 注意光耦的 CTR 参数 3. 注意继电器线圈的 内阻 4. 继电器的开启电压。 因为光耦…

IP组播技术与internet

1.MAC地址分为三类:广播地址;组播地址;单播地址 2.由一个源向一组主机发送信息的传输方式称为组播。 3.组播MAC地址,第一个字节的最后一位为1; 单播MAC地址,第一个字节的最后一位为0; 4.不能…

vue3+vite+ts使用daisyui/tailwindcss

vite创建vue3脚手架 npm init vitelatest myVue3 – --template vue cd .\myVue3\ npm i npm run dev 安装tailwindcss/daisyui 依赖安装 npm install -D tailwindcss postcss autoprefixer daisyui npx tailwindcss init -p 这条命令将生成postcss.config.js(因为加了…

大数据(7)Kafka核心原理揭秘:从入门到企业级实战应用

目录 一、大数据时代的技术革命1.1 消息中间件演进史1.2 Kafka核心设计哲学 二、架构深度解构2.1 核心组件拓扑2.1.1 副本同步机制(ISR) 2.2 生产者黑科技2.3 消费者演进路线 三、企业级应用实战3.1 金融行业实时风控3.2 物联网数据管道 四、生产环境优化…

spring boot大文件与多文件下载

一、简单大文件下载&#xff1a; /*** 下载大文件* param path 路径* param fileName 文件名* return* throws IOException*/ public static ResponseEntity<InputStreamResource> downloadFile(String path, String fileName) throws IOException {Path filePath Path…

第二节:React 基础篇-受控组件 vs 非受控组件

一、场景题&#xff1a;设计一个实时搜索输入框&#xff0c;说明选择依据 受控组件 vs 非受控组件 核心区别 特征受控组件非受控组件数据管理由React状态&#xff08;state&#xff09;控制通过DOM元素&#xff08;ref&#xff09;直接访问更新时机每次输入触发onChange提交…

局部路由守卫

局部路由守卫为我们提供了更细粒度的路由控制&#xff0c;允许我们在特定的路由或组件级别添加鉴权和逻辑处理。局部路由守卫分为 path 守卫和 component 守卫&#xff0c;它们分别适用于不同的场景。 path 守卫&#xff08;路由守卫&#xff09; path 守卫用于在进入特定路由…

Android 16应用适配指南

Android 16版本特性介绍 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概览 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 发布时间 Android 16 适配指南 Google开发平台&…

android display 笔记(十二)CPU,GPU,DPU的区别

CPU&#xff08;Central Processing Unit&#xff09;通用计算&#xff1a;处理复杂逻辑、分支预测、多任务调度。 低延迟&#xff1a;优先快速响应单线程任务。 GPU&#xff08;Graphics Processing Unit&#xff09; 高吞吐量并行计算&#xff1a;适合大规模数据并行处理。…

音频转文本:如何识别音频成文字

Python脚本:MP4转MP3并语音识别为中文 以下是一个完整的Python脚本,可以将MP4视频转换为MP3音频,然后使用语音识别模型将音频转换为中文文本。 准备工作 首先需要安装必要的库: pip install moviepy pydub SpeechRecognition openai-whisper完整脚本 import os from m…

理解 MCP 协议的数据传递:HTTP 之上的一层“壳子

以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现&#xff0c;内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用&#xff0c;以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区&#xff0c;结构清晰&#xff0c;适合分享。 理…

基于ssm网络游戏推荐系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统网络游戏管理采取了人工的管理方法&#xff0c;但这种管理方…