当前位置: 首页 > news >正文

【鉴权】深入探讨 Session:服务器端存储用户状态的机制

目录

  • 引言
  • 一、Session 的定义与概念
    • 1.1 什么是 Session?
    • 1.2 Session 工作流程
    • 1.3 Session 工作原理图示
  • 二、Session 的基本结构
    • 2.1 Session ID
    • 2.2 Session Data
  • 三、Session 的优缺点
  • 四、Session 的生命周期与安全性
    • 4.1 Session 的生命周期
      • 4.1.1 会话创建
      • 4.1.2 会话活动
      • 4.1.3 会话过期
      • 4.1.4 会话删除
    • 4.2 Session 的安全性
      • 4.2.1 Session 劫持
      • 4.2.2 防止 Session 泄露
      • 4.2.3 会话管理策略
  • 五、Session 的常见用途
    • 5.1 用户身份验证
    • 5.2 保护敏感数据
    • 5.3 跨页面状态保持
    • 5.4 多步骤表单或流程
    • 5.5 权限控制和管理
  • 七、优化 Session 使用:解决常见问题
    • 7.1 会话过期问题
    • 7.2 Session 存储优化
    • 7.3 Session 资源消耗问题
    • 7.4 Session 安全性加强
  • 八、Session 与 Cookie 工作流程图
  • 九、Session 管理的高级技巧
    • 9.1 Session 数据持久化
    • 9.2 Session 冷却(Session Cooling)
    • 9.3 避免 Session 泄露
    • 9.4 避免会话固定攻击(Session Fixation Attack)
    • 9.5 Session 失效策略
  • 总结

引言

在现代 Web 开发中,Session 是实现用户状态管理和数据共享的关键机制。它使得服务器能够跨多个请求保持用户的身份信息和操作状态,常见于用户身份验证、权限控制和敏感数据存储等场景。通过使用 Session,开发者能够在无状态的 HTTP 协议上实现有状态的交互,从而提升用户体验和应用的安全性。

尽管 Session 在 Web 开发中扮演着重要角色,但在实际应用中,Session 管理也面临着诸多挑战,如会话过期、资源消耗和安全漏洞等问题。因此,理解 Session 的工作原理、生命周期以及如何有效管理和优化 Session,是开发人员构建稳定、安全应用的基础。

本文将深入解析 Session 的概念、原理、结构以及实际应用,结合示例和图示帮助您全面了解其内部机制。同时,我们还将讨论常见的优化方法和安全措施,帮助您在开发过程中有效避免潜在风险,提升 Web 应用的性能和用户体验。

一、Session 的定义与概念

1.1 什么是 Session?

Session(会话)是服务器端存储用户状态的一种机制,旨在解决 Web 应用在多个请求中如何保持用户身份和状态的问题。由于 HTTP 协议本身是无状态的,即每个请求都是独立的,服务器无法知道同一用户在不同请求间的状态,因此,Session 提供了一种方式,能够通过唯一标识符(Session ID)来将不同请求与同一个用户的状态关联起来。

1.2 Session 工作流程

在 Web 应用中,Session 的工作流程通常如下:

  1. 首次请求:当用户首次访问网站时,服务器会创建一个新的 Session 并为其分配一个唯一的 Session ID
  2. 发送 Session ID:服务器通过 CookieSession ID 发送到客户端(通常是浏览器),客户端保存这个 ID,随后的请求都会携带这个 ID。
  3. 后续请求:每次用户发起请求时,浏览器会自动将 Session ID 携带在请求中(通常是通过 Cookie)。服务器根据该 ID 查找与之关联的用户会话数据,处理请求并返回相应的结果。

Session 的特点

  • 存储位置:会话数据存储在服务器端。
  • 标识符:通过 Session ID 唯一标识每个用户会话。
  • 生命周期:Session 的生命周期与用户的活动密切相关,超时后会被销毁。

1.3 Session 工作原理图示

以下是 Session 工作原理的 Mermaid 图示,帮助理解用户与服务器之间如何交互:

Client Server 请求访问服务器 返回一个 Session ID (通过 Cookie) 发起带 Session ID 的请求 CSDN @ 2136 根据 Session ID 查找用户数据 返回数据给客户端 Client Server

图注:此图展示了客户端与服务器之间如何通过 Session ID 进行身份验证和数据交互。每次用户发起请求时,都会通过 Session ID 确认用户身份,服务器根据 Session ID 查找并更新会话数据。

二、Session 的基本结构

Session 的基本组成包括两个部分:Session IDSession Data

2.1 Session ID

Session ID 是每个会话的唯一标识符,用于标识每个用户会话。它由服务器在创建 Session 时随机生成,通常是一个长字符串。Session ID 主要用于在客户端和服务器之间识别同一用户的多个请求。在用户首次访问时,服务器会为其创建一个 Session,并生成一个唯一的 Session ID。

  • 存储方式:Session ID 通常通过浏览器的 Cookie 传递,浏览器会在每个后续请求中自动携带该 ID。
  • 常见名称:例如,在 Java 中常见的 Session ID 名为 JSESSIONID,而在 PHP 中通常为 PHPSESSID

2.2 Session Data

Session Data 是与用户相关的状态信息,存储在服务器端。它包含了用户的身份信息、登录状态、购物车内容等。不同用户的 Session Data 是隔离的,不会相互干扰。

Session Data 是存储在服务器端的会话数据,通常包含与用户相关的信息,如:

  • 用户身份信息:如用户名、用户 ID 等。
  • 登录状态:是否已经登录,登录时间等。
  • 用户角色:如管理员、普通用户等。
  • 浏览器信息:如用户使用的设备、浏览器类型等。
  • 其他状态信息:如上次访问时间、购物车内容等。

Session Data 是与特定用户相关联的数据,通常保存在服务器端。它包含了用户的登录信息、浏览记录、购物车、权限等。这些信息有助于服务器在后续的请求中识别用户,并根据其状态做出相应的响应。

Session 示例
以下是一个简单的 Session 数据示例,列出了常见的会话数据项:

**Key **描述
user_id用户唯一标识符,通常是数据库的用户 ID
username用户名
logged_in登录状态(true 或 false)
user_role用户角色(如 admin、user)
last_access_time用户上次访问时间
// PHP 示例:创建 Session 并存储用户数据
session_start();  // 启动会话
$_SESSION['username'] = 'john_doe';  // 存储用户信息
$_SESSION['logged_in'] = true;       // 设置用户登录状态
$_SESSION['last_access_time'] = time();

三、Session 的优缺点

优点

  1. 安全性高:由于 Session 数据存储在服务器端,客户端无法直接访问和修改数据,避免了 Cookie 中可能带来的安全隐患(如篡改或伪造)。
  2. 存储容量大:与 Cookie 的 4KB 限制不同,Session 数据可以存储更多的、更加复杂的数据。服务器存储空间通常远大于浏览器的 Cookie 存储空间。
  3. 跨请求保持状态:即使用户请求的是不同的页面或重新加载页面,Session 可以保持一致的用户状态,提升了用户体验。

缺点

  1. 资源消耗大:每个用户的 Session 数据需要在服务器上进行存储。当用户量增加时,服务器的存储压力会增大,可能会对性能产生负面影响。
  2. 会话丢失:如果 Session 超时或服务器发生重启,用户的会话数据会丢失,导致用户需要重新登录。
  3. 客户端依赖:尽管 Session 数据存储在服务器端,但它依赖于客户端存储的 Session ID(通常存储在 Cookie 中)。如果用户禁用 Cookie 或清除 Cookie,则会话无法正常工作。

四、Session 的生命周期与安全性

4.1 Session 的生命周期

Session(会话)的生命周期涉及从创建到删除的全过程。理解这些阶段对于保证用户体验和应用安全非常重要。Session 的生命周期可以概括为以下几个主要阶段:

  • 会话创建:当用户首次访问网站时,服务器会为该用户创建新的 Session,并生成一个 Session ID 用于唯一标识该会话。
  • 会话活动:用户与服务器交互时,服务器会通过 Session ID 访问并更新该用户的会话数据。
  • 会话过期:如果用户长时间未进行操作,服务器会自动销毁该 Session 数据。
  • 会话删除:用户显式注销或关闭浏览器时,服务器会清除相关的 Session 数据。

4.1.1 会话创建

当用户首次访问网站时,服务器会为其创建一个新的 Session,并生成一个唯一的 Session ID。此 Session ID 会被保存在浏览器的 Cookie 中,以便在后续请求中进行身份验证和会话管理。

4.1.2 会话活动

在会话生命周期中,用户与应用的交互会导致会话数据的不断更新。每次请求,服务器会根据 Session ID 查找并使用对应的会话数据,如用户的登录状态、权限、购物车等内容。通过会话管理,用户可以在不同请求之间维持一致的状态。

4.1.3 会话过期

为了避免服务器资源的浪费,Session 会设定一个过期时间。如果用户在该时间段内未进行任何操作,服务器会认为该会话已经过期并删除相应数据。常见的会话超时时间为 30 分钟,具体时间可根据需求配置。

4.1.4 会话删除

当用户显式地注销或关闭浏览器时,服务器会删除会话数据。为了避免遗留无效会话,服务器通常会定期清理过期的 Session 数据,保证系统资源的有效利用。

4.2 Session 的安全性

Session 为 Web 应用提供了便利的状态管理,但也存在一定的安全风险。常见的 Session 安全问题主要包括 Session 劫持Session 固定攻击Session 泄露 等。以下是一些防范措施,以确保 Session 安全性。

4.2.1 Session 劫持

Session 劫持 是指攻击者通过窃取 Session ID,冒充合法用户进行恶意操作。攻击者通常通过以下方式窃取 Session ID

  • 网络监听:在未加密的 HTTP 请求中,攻击者可以通过抓包工具获取 Session ID
  • 跨站脚本攻击(XSS):如果 Session ID 存储在客户端可被 JavaScript 访问的 Cookie 中,恶意脚本可能会窃取该 Session ID

防范措施

  1. 使用 HTTPS 加密传输

    为防止 Session ID 在传输过程中被窃取,应使用加密协议 HTTPS。HTTPS 确保通信的机密性和完整性,防止中间人攻击(MITM)和网络监听。

    // 强烈推荐所有敏感操作都使用 HTTPS
    https://www.example.com/login
    
  2. 设置 HttpOnly 和 Secure Cookie 标志

    • HttpOnly:阻止客户端 JavaScript 访问 Cookie,有效防止 XSS 攻击。
    • Secure:确保 Cookie 只在 HTTPS 连接下传输,避免 Session ID 在不安全的 HTTP 连接中泄露。
    // PHP 设置 Cookie 的 HttpOnly 和 Secure 标志
    setcookie('session_id', $sessionId, time() + 3600, '/', '', true, true);  // Secure 和 HttpOnly
    
  3. Session 固定攻击防护

    Session 固定攻击 是指攻击者强制用户使用一个已知的 Session ID,通过该 ID 获取合法用户的权限。为防止这种攻击,登录成功后应强制更换 Session ID

    // 用户登录后强制更换 Session ID
    session_regenerate_id(true);
    
  4. 缩短会话超时时间

    缩短 Session 的超时时间可以降低会话被盗用的风险。对于高敏感性操作的用户,可以强制进行会话验证,确保会话仍然有效。

4.2.2 防止 Session 泄露

除了通过加密传输和设置 Cookie 标志来防止 Session 被窃取外,还应采取措施避免 Session 泄露:

  • 在处理敏感操作时(如密码修改、支付等),强制用户重新验证身份。
  • 对于会话期间可能引起安全问题的页面,定期检查 Session ID 是否有效,并确保 Session 已过期时强制重新登录。

4.2.3 会话管理策略

  1. 强制使用 HTTPS:确保所有用户与服务器之间的通信都是通过 HTTPS 加密的,尤其是在处理敏感信息时,如登录、支付、用户数据修改等。
  2. 设置合理的 Session 过期时间:为了减少 Session 被窃取的风险,可以将会话的过期时间设置为较短的时间间隔,并定期清理过期会话。
  3. 定期检查会话有效性:对于敏感操作,可以要求用户在执行之前重新进行身份验证,避免由于会话过期或被劫持造成的安全问题。

通过采用这些策略和防范措施,可以有效提升 Session 的安全性,保护用户数据和会话的完整性。

五、Session 的常见用途

5.1 用户身份验证

Session 在用户身份验证中扮演着至关重要的角色,尤其是对于需要认证和授权的 Web 应用。登录后,服务器会创建一个会话(Session),并将用户的身份信息(如 user_idlogged_in 状态)存储在该会话中。

  • 常见流程
    1. 用户在登录页面提交凭证(如用户名和密码)。
    2. 服务器验证用户凭证,若验证成功,则创建一个 Session
    3. 服务器将一个 Session ID 发送到浏览器,浏览器存储这个 Session IDCookie 中。
    4. 在后续的请求中,浏览器会自动将 Session ID 发送到服务器,服务器通过该 Session ID 查找并验证用户身份。

示例:PHP 中如何启动和使用 Session 进行用户身份验证:

session_start();  // 启动会话
// 检查是否已经登录
if (!isset($_SESSION['user_id'])) {header('Location: login.php');  // 重定向到登录页面exit();
}
// 使用 session 存储的用户信息
$user_id = $_SESSION['user_id'];

5.2 保护敏感数据

Session 可用于存储敏感信息,如支付信息、购物车内容等,避免将这些信息存储在客户端。相比于 CookieSession 数据保存在服务器端,减少了数据被篡改或泄露的风险。

  • 常见敏感数据存储
    • 用户的支付信息、订单详情。
    • 暂存的购物车数据、个人设置(例如地址、喜好)。
    • 网站的认证信息,如临时登录令牌或验证码。

示例:在 Session 中存储购物车信息:

session_start();  // 启动会话
$_SESSION['cart'] = ['product_id' => 123,'quantity' => 2
];  // 存储购物车信息

5.3 跨页面状态保持

Session 可帮助在用户浏览不同页面时保持一致的状态信息。例如,用户在网站上的选择(如语言、主题或购物车内容)可以通过 Session 跨多个页面保持不变,从而提升用户体验。

  • 常见应用场景
    • 多步骤的表单(例如,填写地址、付款方式等)。
    • 跨页面保持用户偏好设置(如语言、主题样式等)。
    • 购物车内容或用户的个人设置。

示例:在多步骤表单中使用 Session 保存用户输入的内容:

session_start();  // 启动会话
$_SESSION['form_data'] = ['name' => $_POST['name'],'email' => $_POST['email']
];  // 存储用户填写的表单数据

5.4 多步骤表单或流程

在需要用户完成多个步骤才能完成任务的应用场景中(如注册、订单流程等),Session 可以帮助存储用户在不同步骤中的输入数据,避免用户在每个页面刷新后重新填写所有信息。这样,用户可以在浏览器中跳转到不同的步骤时,保持之前输入的数据,从而提升用户体验并减少填写的繁琐。

示例:多步骤表单的应用
假设一个用户在填写一个订单的表单,需要提供配送地址、选择支付方式以及确认订单等步骤。

// 步骤1:填写地址
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {$_SESSION['address'] = $_POST['address'];header('Location: step2.php');exit();
}
// 步骤2:选择支付方式
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {$_SESSION['payment_method'] = $_POST['payment_method'];header('Location: step3.php');exit();
}
// 步骤3:确认订单
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {$_SESSION['order_confirmed'] = true;// 处理订单逻辑header('Location: thank_you.php');exit();
}

在此示例中,用户每填写一步表单后,信息被存储在 Session 中。当用户跳转到下一步骤时,之前的输入依然存在。

5.5 权限控制和管理

Session 可以帮助在应用中实现权限控制。例如,只有在用户登录并且有特定权限时,才能访问某些页面或执行某些操作。通过在 Session 中存储用户的身份和权限信息,可以确保只有经过验证的用户才能访问受保护的资源。

示例:基于 Session 实现权限控制
在一个 Web 应用中,我们可能有不同的用户角色(如管理员、普通用户),通过 Session 存储用户的角色信息,可以在后端进行权限验证。

session_start();  // 启动会话
// 检查是否为管理员
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {header('Location: no_access.php');  // 无权限访问exit();
}
// 访问受保护的管理员页面
echo "欢迎来到管理员页面!";

在此示例中,服务器会检查 Session 中存储的 role,确保只有当用户的角色为 admin 时才能访问该页面。

通过这种方式,Session 不仅帮助存储用户的身份信息,还能进行精细的权限管理,确保用户的行为符合系统的安全要求。

七、优化 Session 使用:解决常见问题

7.1 会话过期问题

  • 设置 Session 的过期时间,并采取合适的 Session 清理机制
  • 定期清理超时会话,减少服务器负担。

7.2 Session 存储优化

  • 使用外部存储系统,如 RedisMemcached,来存储 Session 数据,尤其适用于分布式环境。
  • 使用 Session 固化(Session Persistence)确保在多台服务器上也能保持会话的一致性。

7.3 Session 资源消耗问题

  • 精简 Session 中存储的数据,只存储必要的信息,避免存储过多大数据。
  • 定期清理已失效的 Session,以释放服务器资源。

7.4 Session 安全性加强

  • 采用 HTTPS 保护 Session 数据的传输,避免 Session 被中间人攻击窃取。
  • 设置 HttpOnlySecure 标志,确保 Session ID 不能被 JavaScript 访问,增强安全性。

八、Session 与 Cookie 工作流程图

以下是 SessionCookie 工作流程的图示例:

User Browser Server 提交登录请求(用户名、密码) 发送登录信息 CSDN @ 2136 CSDN @ 2136 验证用户身份 返回 Session ID 和成功信息 存储 Session ID(在 Cookie 中) 后续请求自动发送 Session ID CSDN @ 2136 查找并验证 Session 数据 CSDN @ 2136 返回用户页面内容 会话保持在服务器端,\nCookie 仅存储 Session ID 发```mermaid 发送请求(浏览网页) 自动发送 Session ID CSDN @ 2136 验证 Session 数据 返回页面内容 通过 Session ID 识别用户,\n保持用户会话状态 User Browser Server

流程解析

  1. 登录请求:用户在浏览器中提交登录信息(如用户名、密码)。
  2. 身份验证:服务器验证用户身份,并生成一个唯一的 Session ID 来标识用户会话。
  3. 存储 Session ID:服务器将 Session ID 发送到浏览器,浏览器将其存储在 Cookie 中。
  4. 后续请求:在后续的请求中,浏览器自动将 Session ID 发送回服务器,服务器根据该 ID 查找对应的用户会话数据。
  5. 会话保持:服务器验证会话数据,并返回相应的页面内容,保持用户的登录状态和会话一致性。

九、Session 管理的高级技巧

除了基本的 Session 管理,还有一些进阶的技术和最佳实践可以用来提高性能和安全性。以下是一些高级技巧:

9.1 Session 数据持久化

如果你的应用需要在多个 Web 服务器之间共享 Session 数据(例如,在负载均衡的环境中),可以使用外部存储系统来存储 Session 数据。常见的选择包括:

  • Redis:高性能的内存数据存储系统,非常适合分布式系统中的 Session 存储。使用 Redis 存储 Session 数据可以确保多个服务器实例之间的一致性。
  • Memcached:类似于 Redis,也是一种高速缓存存储系统,适用于临时 Session 数据存储。

通过将 Session 存储在这些外部系统中,你可以提高 Session 的持久化能力,同时优化分布式环境中的性能。

示例:使用 Redis 存储 Session(以 PHP 为例)

session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc'
);
function open($save_path, $session_name) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);return true;
}function read($session_id) {return $redis->get('session:' . $session_id);
}function write($session_id, $session_data) {$redis->set('session:' . $session_id, $session_data, 3600);return true;
}

9.2 Session 冷却(Session Cooling)

Session Cooling 是一种在高并发场景下,通过延长会话过期时间来减轻服务器负担的技术。在系统负载较高时,可以通过适当增加 Session 的过期时间,避免频繁的 Session 重新创建和清理。

session_start(); 
// 设置 Session 超时时间
ini_set('session.gc_maxlifetime', 3600);  // 1小时

9.3 避免 Session 泄露

为防止 Session 数据被泄露或伪造,应采取以下措施来加强 Session 的安全性:

  • 限制 IP 地址:绑定 Session ID 与用户的 IP 地址,只有当请求来自相同 IP 时,才能验证 Session

    示例:基于 IP 地址的 Session 验证

    session_start();
    if (isset($_SESSION['ip']) && $_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']) {session_destroy(); // 销毁会话header('Location: login.php'); // 重定向exit();
    }
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; // 保存 IP 地址
    
  • 使用 HTTPS:确保所有的 Session 数据都通过 HTTPS 协议传输,避免 Session ID 被中间人攻击窃取。

  • 使用强大的随机数生成算法:确保 Session ID 足够随机,难以猜测。可以使用高质量的随机数生成器来生成 Session ID

  • HttpOnly 和 Secure 标志:设置 CookieHttpOnlySecure 标志,防止 Session ID 被 JavaScript 访问或在不安全的网络环境中传输。

// 设置 Cookie 标志
session_set_cookie_params(['secure' => true,  // 仅在 HTTPS 下传输'httponly' => true, // 禁止 JavaScript 访问'samesite' => 'Strict', // 防止跨站请求伪造攻击
]);

9.4 避免会话固定攻击(Session Fixation Attack)

会话固定攻击是一种攻击手段,攻击者通过预先设定一个 Session ID,并诱导用户在该 Session ID 上登录,从而劫持该会话。为防止这种攻击,可以在用户登录成功后重新生成新的 Session ID

session_start();
session_regenerate_id(true); // 重新生成 Session ID,防止会话固定攻击

9.5 Session 失效策略

Session 应该有适当的失效策略,包括:

  • 超时失效:如果用户在一定时间内没有进行任何操作,系统应自动注销用户,释放会话资源。通常 Session 的超时时间可以通过服务器配置来控制。

    示例:PHP 中设置 Session 超时:

    session_start();
    $timeout = 1800;  // 设置会话超时时间为30分钟
    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout) {session_unset();  // 清空 Session 数据session_destroy();  // 销毁会话header('Location: login.php');  // 重定向到登录页面exit();
    }
    $_SESSION['last_activity'] = time();  // 更新最后活动时间
    
  • 手动注销:为用户提供清晰的注销功能,允许用户主动退出并清理会话数据。

session_start();
session_unset();  // 清除所有会话变量
session_destroy();  // 销毁会话
header('Location: login.php');  // 重定向到登录页
exit();

总结

Session 是 Web 开发中不可或缺的组成部分,它使得开发者能够在无状态的 HTTP 协议上创建持久的用户会话,确保用户在不同请求之间保持一致性。然而,随着会话管理需求的增加,开发者需要深入理解 Session 的工作原理、安全性挑战和生命周期管理。

本文不仅详细解释了 Session 的定义和结构,还针对常见问题提供了优化解决方案。通过这些理论与实践相结合的内容,您可以有效地管理和优化 Session,提升 Web 应用的性能、安全性和用户体验。

无论是在构建身份验证系统、保护敏感数据,还是处理跨页面的状态保持,Session 的使用都是确保应用稳定运行的关键。掌握 Session 管理的最佳实践,能够帮助您构建更加安全和高效的 Web 应用。



http://www.mrgr.cn/news/69358.html

相关文章:

  • Ubuntu22.04.2 k8s部署
  • DHTMLX-gantt组件显示不同的颜色
  • STM32芯片EXIT外部中断的配置与原理以及模板代码(标准库)
  • 新手教学系列——善用 VSCode 工作区,让开发更高效
  • H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因
  • 解锁微前端的优秀库
  • 如何克服少儿编程教育五大挑战,为孩子提供更优质的编程教育?
  • 深入理解一致性算法:保障分布式系统的可靠基石
  • 递推经典例题 - 爬楼梯
  • 大模型AWQ量化Qwen模型和推理实战教程
  • Linux:调试器 gdb/cgdb 的使用
  • VMware中的重要日志文件 vobd.log 学习总结
  • C#核心(9)静态类和静态构造函数
  • 知识图谱是如何通过数据集构建的,比如通过在MSCOCO和Flickr30k数据集和Visual Genome数据集
  • MySQL性能测试方案设计
  • 万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
  • Python数据预处理
  • 职场中如何向下属表达自己的观点
  • 华为私有接口类型hybrid
  • 医学可视化之热力图
  • C++接口类, 抽象类和实体类简述
  • 【C++】详解RAII思想与智能指针
  • 基于大语言模型的规划
  • 网站开发-苍穹外卖-day3:苍穹外卖和瑞吉外卖哪个更好???
  • UE5 HLSL 学习笔记
  • 111 - Lecture 8