【鉴权】深入解析OAuth 2.0:访问令牌与刷新令牌的安全管理

news2024/11/7 4:30:20

目录

  • 引言
  • 一、访问令牌(Access Token)
    • 1.1 访问令牌概述
    • 1.2 访问令牌的格式
      • 1.2.1 JWT(JSON Web Token)
        • 1.2.1.1 JWT 结构
        • 1.2.1.2 示例 JWT
      • 1.2.2 Bearer Token
    • 1.3 访问令牌的有效期
    • 1.4 访问令牌的工作流程
  • 二、刷新令牌(Refresh Token)
    • 2.1 刷新令牌概述
    • 2.2 刷新令牌的工作机制
      • 2.2.1 刷新令牌请求示例
      • 2.2.2 刷新令牌响应示例
    • 2.3 刷新令牌的安全性
    • 2.4 刷新令牌的工作流程
  • 三、访问令牌与刷新令牌的工作流程
    • 3.1 工作流程
    • 3.2 工作流程图
    • 3.2 工作流程时序图
  • 四、令牌生命周期与安全性考虑
    • 4.1 访问令牌的生命周期
      • 4.1.1 访问令牌的生成与有效期
      • 4.1.2 访问令牌的存储与保护
      • 4.1.3 访问令牌的使用与验证
      • 4.1.4 访问令牌的过期与更新
    • 4.2 刷新令牌的生命周期
      • 4.2.1 刷新令牌的生成与有效期
      • 4.2.2 刷新令牌的存储与保护
      • 4.2.3 刷新令牌的安全问题与防护
    • 4.3 令牌的安全性建议
      • 4.3.1 令牌的加密存储与传输
      • 4.3.2 令牌最小化原则
      • 4.3.3 限制令牌的作用域与权限
      • 4.3.4 定期检查与吊销令牌
      • 4.3.5 实施多因素认证(MFA)
      • 4.3.6 防范跨站请求伪造(CSRF)和跨站脚本攻击(XSS)
  • 五、安全最佳实践
    • 5.1 访问令牌与刷新令牌的安全性
      • 5.1.1 加密存储与传输
      • 5.1.2 短期有效期与自动刷新
      • 5.1.3 刷新令牌失效机制
      • 5.1.4 令牌撤销机制
    • 5.2 防止令牌泄露
  • 总结

引言

在现代网络安全和授权领域,OAuth 2.0 协议扮演着至关重要的角色,特别是在API授权、身份验证和会话管理等方面。作为OAuth 2.0协议的核心组成部分,**访问令牌(Access Token)刷新令牌(Refresh Token)**不仅确保了客户端与资源服务器之间的安全通信,还提供了灵活的会话管理机制。访问令牌用于用户身份验证并授权访问特定资源,而刷新令牌则允许在令牌过期后自动获取新的访问令牌,从而避免频繁的登录操作并保持会话的持续性。

本文将深入探讨这两个关键概念的工作原理、格式和生命周期,重点讨论它们的安全性和最佳实践。通过合理设计令牌管理机制,开发者可以有效提升系统的安全性,同时优化用户体验。本篇文章旨在帮助开发者了解如何通过安全策略、最佳存储与传输实践,减少令牌泄露、滥用和伪造等风险,确保应用的安全性和稳定性。

一、访问令牌(Access Token)

1.1 访问令牌概述

访问令牌(Access Token) 是在 OAuth 2.0 协议中用于授权客户端访问受保护资源的凭证。它由授权服务器发放,并通过它来确认客户端是否有权访问特定的资源。

访问令牌通常具有较短的有效期,这使得它在保护资源时能够提供较高的安全性。访问令牌一旦过期,客户端必须使用 刷新令牌 获取新的访问令牌。

1.2 访问令牌的格式

OAuth 2.0 中的访问令牌有多种格式,最常见的两种格式是 JWT(JSON Web Token)Bearer Token

1.2.1 JWT(JSON Web Token)

JWT 是 OAuth 2.0 中常见的访问令牌格式,它是一种自包含的令牌格式。JWT 包含三部分:头部(Header)、载荷(Payload)和签名(Signature)。它的优势在于可以携带用户信息、权限以及其他元数据,而无需访问外部数据库进行验证。

1.2.1.1 JWT 结构
  1. 头部(Header):通常包含令牌的类型(JWT)和使用的签名算法(如 HMAC SHA256)。

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  2. 载荷(Payload):包含了需要传递的信息,例如用户标识符(sub)、授权范围(scope)和其他与认证相关的数据。需要注意的是,JWT 载荷是未加密的,可以被任何人查看,但不可以篡改。

    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  3. 签名(Signature):通过签名算法对头部和载荷进行签名,保证令牌的完整性与真实性。签名方式通常如下:

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    
1.2.1.2 示例 JWT

假设你有一个 JWT 令牌,其结构如下所示:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

这个令牌由三部分组成,分别是 base64 编码后的头部、载荷和签名。你可以通过解码 JWT 查看其中的信息。

1.2.2 Bearer Token

Bearer Token 是另一种常见的访问令牌格式,通常它是一个简单的字符串,客户端在请求资源时将其放在 HTTP 请求的 Authorization header 中。

Authorization: Bearer <access_token>

Bearer Token 并不包含内部结构或加密,而是通过访问令牌验证机制确保其有效性。它的简单性使得它在快速集成的应用中非常流行,但它的安全性依赖于传输过程中的加密和存储策略。

1.3 访问令牌的有效期

访问令牌在 OAuth 2.0 中通常设置为较短的有效期,通常为 1 小时或更短。有效期设置较短是为了减少令牌被滥用的风险,特别是在可能被盗用的情况下。

访问令牌过期后,客户端将无法再访问受保护资源,需要使用刷新令牌重新获取新的访问令牌。

访问令牌有效期示例

通常,在 JWT 中,访问令牌会通过 exp 字段来表示过期时间:

{
  "exp": 1609459200,  // 过期时间戳
  "sub": "user123",   // 用户标识
  "scope": "read write"
}

在这个例子中,exp 字段的值表示令牌的过期时间。客户端可以根据当前时间与 exp 字段的值进行对比,判断令牌是否过期。

1.4 访问令牌的工作流程

  1. 客户端通过授权服务器获取访问令牌。
  2. 使用该访问令牌向资源服务器请求访问受保护资源。
  3. 资源服务器验证访问令牌的合法性,如果有效,返回资源数据。
  4. 如果访问令牌过期,客户端使用刷新令牌来获取新的访问令牌。

二、刷新令牌(Refresh Token)

2.1 刷新令牌概述

刷新令牌(Refresh Token) 是 OAuth 2.0 中用于获取新的访问令牌的凭证。与访问令牌不同,刷新令牌通常具有较长的有效期(几天、几周甚至更长时间)。刷新令牌在客户端使用时不会直接访问资源,而是用于在访问令牌过期时请求新的访问令牌。

2.2 刷新令牌的工作机制

当访问令牌过期后,客户端无需请求用户重新授权,只需要使用有效的刷新令牌向授权服务器请求新的访问令牌。

2.2.1 刷新令牌请求示例

客户端向授权服务器发送包含刷新令牌的请求,示例如下:

POST /oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=<refresh_token>&client_id=<client_id>&client_secret=<client_secret>

授权服务器验证刷新令牌是否有效,如果有效,则返回一个新的访问令牌及可能的新刷新令牌。

2.2.2 刷新令牌响应示例

{
  "access_token": "new_access_token",
  "token_type": "bearer",
  "expires_in": 3600,
  "refresh_token": "new_refresh_token"
}

2.3 刷新令牌的安全性

刷新令牌具有较长的有效期,因此它的安全性尤为重要。如果刷新令牌被盗,攻击者可以使用它持续获取新的访问令牌,进而访问用户数据。为了确保安全,刷新令牌的存储和传输需要格外谨慎。

刷新令牌的安全存储方式

  • 服务器端存储:刷新令牌可以保存在服务器端,客户端不保存刷新令牌。客户端每次请求新的令牌时,通过后端接口交换令牌。
  • 加密存储:如果必须存储在客户端,则应对刷新令牌进行加密处理,确保其安全。

2.4 刷新令牌的工作流程

  1. 获取刷新令牌:授权服务器发放访问令牌和刷新令牌。
  2. 使用刷新令牌获取新令牌:访问令牌过期后,客户端使用刷新令牌向授权服务器请求新的访问令牌。
  3. 重新认证:如果刷新令牌失效,客户端必须重新请求用户授权。

三、访问令牌与刷新令牌的工作流程

在现代应用中,OAuth 2.0 和 OpenID Connect 协议被广泛应用来实现安全的身份认证和授权。为了提升用户体验与系统的安全性,通常会采用 访问令牌(Access Token)刷新令牌(Refresh Token) 这两种令牌机制。访问令牌用于访问保护资源,而刷新令牌则用于在访问令牌过期时请求新的访问令牌。接下来,我们将通过流程图和详细说明,来展示这两种令牌在系统中的工作流程。

3.1 工作流程

1. 用户授权

在用户首次登录或访问需要授权的资源时,客户端应用会向授权服务器请求用户的授权。用户会被引导到授权服务器,并要求提供必要的认证信息(如用户名和密码)。

2. 授权服务器生成访问令牌与刷新令牌

一旦用户授权成功,授权服务器会生成两种令牌:

  • 访问令牌(Access Token):它用于短时间内访问受保护的资源。通常具有较短的有效期(例如 1 小时)。
  • 刷新令牌(Refresh Token):它用于在访问令牌过期后,重新获取新的访问令牌。刷新令牌通常有效期较长,甚至可以是永久有效。

3. 客户端收到令牌

授权服务器将生成的访问令牌和刷新令牌返回给客户端。客户端将这些令牌保存在本地(如存储在浏览器的 localStorage 或移动设备的安全存储中)。

4. 客户端请求资源

客户端应用需要访问受保护的资源时,它会将访问令牌附带在 HTTP 请求头中,发送到资源服务器。

5. 资源服务器验证访问令牌

资源服务器收到客户端请求后,首先会验证访问令牌的有效性。如果令牌有效,它将允许访问对应的资源。

6. 返回资源

如果访问令牌有效,资源服务器会将请求的资源返回给客户端。

7. 访问令牌过期

访问令牌是有有效期的,通常会在一段时间后过期。当客户端尝试使用已过期的访问令牌访问资源时,资源服务器会拒绝请求,提示令牌过期。

8. 客户端使用刷新令牌请求新令牌

当访问令牌过期时,客户端会使用之前获取到的刷新令牌,向授权服务器请求一个新的访问令牌。

9. 授权服务器验证刷新令牌

授权服务器会验证刷新令牌是否有效。如果有效,授权服务器会生成新的访问令牌(以及可能的新刷新令牌),并返回给客户端。

10. 客户端重新请求资源

客户端使用新的访问令牌重新请求资源。如果刷新令牌本身也过期或失效,客户端可能需要重新引导用户进行授权。

11. 刷新令牌失效,重新授权

如果刷新令牌过期或被吊销,客户端需要引导用户重新进行授权,重新获取一对新的访问令牌和刷新令牌。

3.2 工作流程图

整个工作流程可以用以下图示展示,简要说明每个步骤的交互和关系:

CSDN @ 2136
用户授权
授权服务器
生成访问令牌与刷新令牌
返回访问令牌与刷新令牌
客户端请求资源
资源服务器验证访问令牌
返回资源
访问令牌过期
客户端使用刷新令牌请求新令牌
授权服务器验证刷新令牌
返回新的访问令牌与刷新令牌
如果刷新令牌失效, 重新授权
CSDN @ 2136

在上面的流程图中,我们能够看到:

  • 用户首先授权客户端访问。
  • 授权服务器生成并返回访问令牌与刷新令牌。
  • 客户端使用访问令牌请求资源,并由资源服务器验证该令牌。
  • 当访问令牌过期时,客户端通过刷新令牌请求新的访问令牌。
  • 如果刷新令牌失效,客户端需要重新授权。

3.2 工作流程时序图

为了进一步清晰地展示访问令牌和刷新令牌的工作流程,我们将这个流程转化为一个时序图(sequence diagram)。时序图能够很好地展现参与者之间的交互顺序及其生命周期。以下时序图展示了访问令牌和刷新令牌的交互过程:

用户 客户端应用 授权服务器 资源服务器 CSDN @ 2136 用户授权 生成访问令牌与刷新令牌 返回访问令牌与刷新令牌 请求资源(附带访问令牌) CSDN @ 2136 验证访问令牌 返回资源 访问令牌过期 使用刷新令牌请求新令牌 CSDN @ 2136 验证刷新令牌 返回新的访问令牌与刷新令牌 重新请求资源(使用新令牌) 刷新令牌失效,重新授权 用户 客户端应用 授权服务器 资源服务器

在时序图中,我们能够看到:

  • 用户授权流程,客户端请求授权并得到访问令牌和刷新令牌。
  • 客户端用访问令牌请求资源,资源服务器验证并返回资源。
  • 访问令牌过期后,客户端使用刷新令牌请求新的访问令牌。
  • 授权服务器验证刷新令牌并返回新的令牌。
  • 客户端再次使用新令牌请求资源。
  • 如果刷新令牌失效,客户端需要重新引导用户进行授权。

四、令牌生命周期与安全性考虑

在现代应用中,令牌(Token)作为身份验证和授权的核心组件,起到了至关重要的作用。为了确保令牌在使用过程中的安全性,我们需要考虑令牌的生命周期管理和如何有效防止潜在的安全威胁。令牌包括访问令牌(Access Token)和刷新令牌(Refresh Token),两者在生命周期管理和安全防护上的策略有所不同。本章将详细探讨这两类令牌的生命周期及安全性措施,涵盖令牌的生成、存储、传输、过期、吊销等关键环节,并为实现更高安全性提供实践指导。

4.1 访问令牌的生命周期

4.1.1 访问令牌的生成与有效期

访问令牌通常在用户成功认证后由身份提供方(如 OAuth2 或 OpenID Connect 服务)生成。生成的令牌包含用户的身份信息以及相关授权信息,通常会采用 JWT(JSON Web Token)格式。访问令牌的有效期一般较短,通常为1小时到24小时不等。短生命周期的设计是为了减少令牌被滥用的风险。

访问令牌的生命周期

事件描述时间
认证成功用户成功登录系统后,身份提供方生成访问令牌-
使用访问令牌用户访问受保护资源,令牌在请求中携带1小时至24小时
令牌过期或失效令牌超出有效期,不能再使用到期时
重新认证或刷新令牌用户需要重新登录或使用刷新令牌更新访问令牌用户重新认证或刷新

4.1.2 访问令牌的存储与保护

访问令牌通常存储在客户端应用中,常见的存储方式有两种:

  1. 浏览器端存储:

    • 存储位置: 使用 HTTP-only Cookie 或 localStorage
    • 安全措施: 存储在 HTTP-only Cookie 中能够防止 JavaScript 访问令牌,有效防止 XSS 攻击。
    • 建议: 配置 Secure 标志,确保令牌仅通过 HTTPS 传输,防止中间人攻击(MITM)。
  2. 移动端存储:

    • 存储位置: 在 iOS 中使用 Keychain,在 Android 中使用 Keystore。
    • 安全措施: 这些平台提供了加密存储功能,能有效保护令牌。

4.1.3 访问令牌的使用与验证

访问令牌的使用场景主要是通过 API 请求访问受保护资源。每次请求时,客户端将令牌作为 Authorization 头部(Bearer <token>)传送给服务器。服务器会验证令牌的有效性,如果令牌有效,允许用户访问资源,否则返回错误响应。

Authorization: Bearer <access_token>

4.1.4 访问令牌的过期与更新

访问令牌一般设定较短的有效期,以限制被滥用的窗口。过期后的令牌会被拒绝使用。常见的解决方式是使用 刷新令牌(Refresh Token) 机制,即通过持有有效的刷新令牌来获取新的访问令牌,延续会话而不需要重新认证。

4.2 刷新令牌的生命周期

4.2.1 刷新令牌的生成与有效期

刷新令牌的有效期通常较长,可能是数天、数月甚至长期有效。刷新令牌的主要作用是当访问令牌过期时,能够使用它来获取新的访问令牌。为了避免刷新令牌长期有效导致的安全问题,可以设置合理的过期时间并在一定条件下强制吊销。

刷新令牌的生命周期

事件描述时间
刷新令牌生成访问令牌过期,刷新令牌生成1天至数月
刷新令牌使用使用刷新令牌获取新访问令牌每次访问令牌过期时
刷新令牌过期或吊销刷新令牌失效,用户需要重新认证按设定时间或异常事件
重新认证令牌失效后强制用户重新认证用户手动重新认证

4.2.2 刷新令牌的存储与保护

由于刷新令牌的有效期较长,它的安全性要求更加严格。应避免刷新令牌泄露,否则攻击者可以长时间持有有效令牌。因此,刷新令牌应当与访问令牌一起加密存储,并且最好设置 SameSite 属性以防止 CSRF 攻击。

4.2.3 刷新令牌的安全问题与防护

刷新令牌长期有效可能带来更高的安全风险,因此必须采取措施确保其安全性:

  • 吊销机制: 在检测到异常行为(如用户密码更改、IP地址变动等)时应吊销刷新令牌。
  • 短生命周期刷新令牌: 尽量将刷新令牌的有效期缩短,定期更新刷新令牌。

4.3 令牌的安全性建议

为了确保令牌在生命周期内的安全性,应遵循以下安全措施:

4.3.1 令牌的加密存储与传输

  • 加密存储:令牌应存储在安全的存储机制中,避免暴露。对于 Web 应用,使用 HTTPOnlySecure 标志的 cookies,使令牌无法被浏览器中的 JavaScript 访问。对于移动应用,使用系统的安全存储 API(如 iOS 的 Keychain 或 Android 的 Keystore)存储令牌。
  • 加密传输:所有与令牌相关的通信必须通过 HTTPS 协议加密,以防止中间人攻击(MITM)。确保令牌在网络传输过程中无法被窃取。

4.3.2 令牌最小化原则

令牌应仅包含进行身份验证和授权所需的最小信息,避免将敏感数据(如个人信息)嵌入令牌中。通过实现令牌最小化,可以有效降低令牌泄露后可能造成的损失。令牌的作用范围和功能应尽可能精简,只授予用户最必要的权限。

4.3.3 限制令牌的作用域与权限

通过精确控制令牌的权限和作用范围,可以确保令牌仅访问必要的资源。使用 OAuth2 的作用域(Scope)机制对令牌的权限进行限制,防止过度授权。特别是在多用户环境中,限制每个令牌的权限范围至关重要,它能有效防止权限过大导致的安全问题。例如:

作用域说明
read只允许访问资源的读取权限
write允许修改资源的权限
admin允许访问管理员权限的资源

4.3.4 定期检查与吊销令牌

  • 定期检查:定期检查令牌的有效性,发现过期或可疑的令牌应及时吊销。
  • 安全事件检测:结合安全事件(如登录异常、IP 地址变化、频繁的认证失败等)监测,及时吊销潜在的滥用令牌。
  • 令牌撤销机制:当用户注销、修改密码或更改权限时,立即使相关令牌失效,防止令牌被盗用。

4.3.5 实施多因素认证(MFA)

多因素认证(MFA)是增强令牌安全性的有效措施,即使令牌被攻击者窃取,缺少第二重身份验证(如短信验证码或生物识别)仍无法访问系统。通过要求用户提供第二重身份验证(如短信验证码、动态口令、指纹识别等),可以显著提高令牌的安全性,降低令牌被盗用的风险。MFA 是一种有效的补充措施,特别是在处理高风险操作时尤为重要。

4.3.6 防范跨站请求伪造(CSRF)和跨站脚本攻击(XSS)

  • 防范 CSRF:在每个请求中添加随机令牌(CSRF Token)和确保浏览器发送的 cookie 有 SameSite 属性来验证请求来源,防止跨站请求伪造(CSRF)攻击。
  • 防范 XSS:严格过滤和验证用户输入,防止跨站脚本(XSS)攻击,避免恶意脚本窃取存储在浏览器中的令牌。

五、安全最佳实践

5.1 访问令牌与刷新令牌的安全性

确保 OAuth 2.0 系统的访问令牌和刷新令牌安全,以下是具体的最佳实践:

5.1.1 加密存储与传输

  • 令牌加密存储:确保访问令牌与刷新令牌在客户端存储时使用安全存储机制,如 HTTPOnlySecure cookies(Web)或 iOS Keychain/Android Keystore(移动应用)。
  • 使用 HTTPS:所有通信都应通过 HTTPS 加密传输,防止令牌在传输过程中被拦截。

5.1.2 短期有效期与自动刷新

  • 短期访问令牌:访问令牌应设置较短的有效期(如 15 分钟或 1 小时),有效期到期后通过刷新令牌获取新的访问令牌。
  • 自动刷新机制:客户端应实现自动刷新机制,在令牌过期前自动使用刷新令牌获取新的访问令牌,确保无缝用户体验。

5.1.3 刷新令牌失效机制

  • 刷新令牌失效:用户登出、密码修改或权限变更时,应立即使刷新令牌失效,以防止攻击者通过被盗的刷新令牌持续访问。
  • 最小权限原则:访问令牌和刷新令牌应仅授予最小权限,降低潜在风险。

5.1.4 令牌撤销机制

  • 令牌撤销:当用户撤销授权或注销时,立即使相关令牌失效。授权服务器应支持令牌撤销功能,以实时反映用户授权状态。

5.2 防止令牌泄露

令牌泄露是 OAuth 2.0 系统中的重大安全风险,以下是防护措施:

  • 避免在 URL 中传递令牌:不应通过 URL 参数传递访问令牌或刷新令牌,因为 URL 可能被浏览器缓存、记录或通过第三方工具捕获。推荐通过请求头中的 Authorization 字段传递令牌:

    Authorization: Bearer <access_token>
    
  • 令牌过期处理:设置较短的令牌过期时间(如 15 分钟),减少令牌泄露的滥用窗口。如果使用 JWT 类型令牌,令牌泄露后攻击者只能在短时间内滥用。

  • 防范 CSRF 和 XSS 攻击:通过设置 SameSite 属性增强浏览器对 cookies 的安全性,并使用 CSRF Token 防止跨站请求伪造(CSRF)攻击;严格验证和过滤用户输入,防止跨站脚本(XSS)攻击。

总结

在现代Web与移动应用开发中,访问令牌(Access Token)与刷新令牌(Refresh Token)是确保身份验证和授权的核心机制。正确理解并合理设计它们的生命周期和安全策略,是保障用户数据与系统资源安全的关键。

访问令牌通常用于授权客户端访问受保护资源,其有效期较短,旨在减少潜在的安全风险。而刷新令牌则用于在访问令牌过期后,获取新的访问令牌,确保用户不需要频繁登录,提升用户体验。为了保证令牌的安全性,开发者应采取一系列措施,如使用 HTTPS 加密通信、存储令牌时确保安全性、采用短期有效的访问令牌并实现自动刷新机制、实施令牌撤销和最小权限原则等。

通过加密存储令牌、限制令牌权限范围、定期检查令牌的有效性、结合多因素认证等策略,可以有效防止令牌被滥用或泄露,从而保障系统的安全性与稳定性。综上所述,合理的令牌管理和最佳安全实践是构建安全可靠OAuth 2.0 授权系统的基础。


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

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

相关文章

C++转义序列

\b \b是一个退格符&#xff08;backspace character&#xff09;&#xff0c;它的作用是将光标向左移动一个位置&#xff0c;但并不会删除光标位置上的字符。这个行为在某些情况下可能会导致视觉上的字符“消失”&#xff0c;但实际上这些字符仍然存在于输出缓冲区中&#xf…

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决

问题描述 问题背景 微信小程序访问后端img资源的时候&#xff0c;偶尔出现这个感叹号&#xff0c;图片加载不出来&#xff0c;但是对应的url贴出来在浏览器中访问&#xff0c;或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…

初始JavaEE篇 —— 网络编程(1):基础的网络知识

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 前言&#xff1a; 网络的发展历程 网络通信基础 IP地址 端口号 网络协议 网络通信的流程 前言&#xff1a; 我们现在所…

基于SSM+小程序的高校寻物平台管理系统(失物1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本基于微信小程序的高校寻物平台有管理员&#xff0c;用户以及失主三个角色。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;失主管理&#xff0c;寻物启示管理&#xff0c;拾…

leetcode21:合并两个有序列表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示…

【c++丨STL】vector的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 vector简要介绍 一、vector的默认成员函数 构造函数(constructor) 析构函数(destructor) 赋值运算符重载operator 二、vector的容量接口…

【数据分享】2024年我国省市县三级的生活服务设施数量(46类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市生活服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、…

自定义SpringBoot的Start应用场景及常见错误

开发背景 为了将环信(即使通讯)的模块独立出来实现复用&#xff0c;提供给多个模块使用。 实现方式 1.目录结构 2.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> &l…

gdb和make工具

gdb工具&#xff1a; GDB的主要功能 断点设置&#xff1a;允许开发者在特定的代码行设置断点&#xff0c;当程序执行到该行时会自动暂停&#xff0c;方便开发者进行调试和分析。 变量查看与修改&#xff1a;在程序运行过程中&#xff0c;可以查看和修改变量的值&#xff0c;以…

Ceisum无人机巡检视频投放

公司投标内容有个视频投放的功能动画&#xff0c;原本想实现这么一个效果&#xff1a; 案例效果来自别人的展示作品&#xff0c;Leader一眼就相中了这个效果&#xff0c;可惜别人的终究是别人的&#xff0c;又不会白白给你&#xff0c;终究是要自己动手尝试。 动画方面的展示…

Spring:Bean(创建方式,抽象继承,工厂Bean,生命周期)

1&#xff0c;Bean的创建 1.1&#xff0c;调用构造器创建Bean 调用Bean类的无参构造函数来创造对象&#xff0c;因此要求提供无参构造函数。在这种情况下class元素是必须的&#xff0c;值就是Bean对象的实现类。 如果采用设值注入&#xff0c;Spring容器将使用默认的构造器来创…

ViT面试知识点

文章目录 VITCLIPBlipSAMLSegFast TransformerYOLO系列问题 BatchNorm是对一个batch-size样本内的每个特征做归一化&#xff0c;LayerNorm是对每个样本的所有特征做归一化。 Layer Normalization&#xff08;层归一化&#xff0c;简称LayerNorm&#xff09;是一种在深度学习中…

了解数据库并发产生的问题

在数据库管理系统中&#xff0c;并发控制是一个至关重要的方面。随着多个用户或进程同时访问和修改数据库中的数据&#xff0c;如果没有适当的并发控制机制&#xff0c;就可能导致数据不一致、丢失更新、脏读、不可重复读和幻读等问题。在单用户系统中&#xff0c;数据库操作是…

qt QFontDialog详解

1、概述 QFontDialog 是 Qt 框架中的一个对话框类&#xff0c;用于选择字体。它提供了一个可视化的界面&#xff0c;允许用户选择所需的字体以及相关的属性&#xff0c;如字体样式、大小、粗细等。用户可以通过对话框中的选项进行选择&#xff0c;并实时预览所选字体的效果。Q…

【JavaSE】(2) 方法

一、认识方法 1. 方法的定义 修饰符 返回类型 方法名(形参类型 形参名, ......){......return 返回值; } 示例代码&#xff1a; 2. 方法的作用 增强代码的可复用性。&#xff08;避免重复造轮子&#xff09;增强代码的易管理性。&#xff08;改方法就行&#xff0c;不用到处…

享元模式及其运用场景:结合工厂模式和单例模式优化内存使用

介绍 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过共享对象来减少内存使用&#xff0c;尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用&#xff0c;从而有效地控制和复用对象的创建。在享元模式中&am…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

【赵渝强老师】安装部署Memcached

Memcached是一个高性能的分布式的内存对象缓存系统。通过使用Memcached可以支持高负载的网站系统&#xff0c;以分担数据库的压力。Memcached通过在内存里维护一个统一的巨大的Hash表来存储各种格式的数据&#xff0c;包括图像、视频、文件以及数据库检索的结果等。但是Memcach…

代码要走的路:编程“三部曲”

代码要成为可以运行的程序&#xff0c;总共有3步&#xff1a; 1&#xff0e;编辑&#xff08;edit&#xff09; 这里的编辑不是像出版编辑那样&#xff0c;只把现成的东西修修改改&#xff0c;而是指编写代码。 编写代码是实实在在的原创&#xff0c;不是整理加工&#xff0…

支持向量机相关证明 解的稀疏性

主要涉及拉格朗日乘子法&#xff0c;对偶问题求解