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

Laravel 中使用 JWT 作用户登录,身份认证

什么是JWT:

JWT 全名 JSON Web Token,是一种开放标准 (RFC 7519)。

用于在网络应用环境间安全地传输信息作为 JSON 对象。

它是一种轻量级的认证和授权机制,特别适合分布式系统的身份验证。

核心特点

  1. 紧凑格式:体积小,可通过URL、POST参数或HTTP头发送
  2. 自包含:包含所有必要信息,减少数据库查询
  3. 可验证:使用数字签名保证完整性
  4. 跨语言支持:几乎所有主流编程语言都有实现

JWT 的结构

由三部分组成,用点(.)分隔:

Header.Payload.Signature

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vZGV2LXNob3AtbWFuYWdlLWFwaS5ob21lLmtsZi5jb20vc2hvcC1hcGkvbG9naW4iLCJpYXQiOjE3NDM0MTM1NjcsImV4cCI6MTc0MzQxNzE2NywibmJmIjoxNzQzNDEzNTY3LCJqdGkiOiJUZjR1OENxRHB0dW9vTHZpIiwic3ViIjoiNDgwMyIsInBydiI6IjI3ZjQxNDY0MDE3YjAwZTE5MmIxNzUyNjMzNGJlNmI1ZGIwYTBkOTQifQ.5uRxjozQ89eK-zSPLF8aV2bKxWXpsJRgR5XmU9sCy3Q

工作流程

  1. 用户登录:客户端发送凭据到认证服务器
  2. 验证凭据:服务器验证后生成JWT
  3. 返回JWT:服务器将JWT返回给客户端
  4. 存储JWT:客户端存储JWT(通常localStorage或cookie)
  5. 携带JWT:客户端在请求头中发送JWT
Authorization: Bearer <token>
  1. 验证JWT:服务器验证JWT并授权访问

laravel 安装配置JWT

1.安装JWT包

composer require tymon/jwt-auth

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e5df5c6f62ed41e5aee53e68f09e9c8e.png

2.发布 JWT 配置文件

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

在这里插入图片描述
此时会在config 目录下生成 jwt.php 配置文件

3. 生成密钥

php artisan jwt:secret

这会在 .env 文件中添加 JWT_SECRET,注意的是 生产环境单独生成,为了安全

用户登录配置

1.用户模型配置

创建用户模型文件,必须继承 Authenticatable ,实现 两个方法 getJWTIdentifiergetJWTCustomClaims,必须的。

<?phpnamespace App\Models;use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;class AdminUser extends Authenticatable implements JWTSubject
{// ... 其他代码/*** 获取JWT标识符*/public function getJWTIdentifier(){return $this->getKey();}/*** 获取JWT自定义声明*/public function getJWTCustomClaims(){return ['role' => $this->role,  // 示例:添加用户角色到token// 可以添加更多自定义声明];}
}

2.配置 auth.php

文件: config/auth.php

(2.1) 配置 Guard(守卫)

Guard 是 Laravel 认证系统的核心概念之一,它定义了:

  • 如何认证用户(使用什么驱动 driver)

    • session:传统的 web 应用认证方式(使用 cookies 和 session)

    • token:API 令牌认证(Laravel 自带的基础 token 认证)

    • jwt:使用 JWT 包提供的认证驱动

  • 从哪里获取用户信息(使用什么 provider

    • 指定使用哪个用户提供者(在 providers 数组中定义)

代码如下:

'guards' => ['web' => ['driver' => 'session','provider' => 'users',],//后台api守卫'admin-api' => ['driver' => 'jwt',  // 修改为 jwt 驱动'provider' => 'admin-user',  // 使用admin-user 作为 provider],],
  1. admin-api 是我定义的后台api的守卫
  2. driver驱动 设置JWT
  3. provider 用户提供者 用 admin-user
(2.2) 配置 providers (用户提供者)
'providers' => ['users' => ['driver' => 'eloquent','model' => App\Models\User::class,],'admin-user' => ['driver' => 'eloquent','model' => AdminUser::class,]
],
  1. admin-user 为前面引用的 用户提供者 名称
  2. driver 为 数据驱动
    • eloquent 驱动(最常用),使用 Eloquent ORM 从数据库获取用户
      • 使用 eloquent 驱动时,模型必须实现 Authenticatable 接口,具体看第一步
    • database 驱动,直接使用数据库查询构造器(非 Eloquent)
  3. model 为第一步定义的用户模型 AdminUser
(2.3) 配置 默认守卫
 'defaults' => ['guard' => 'admin-api','passwords' => 'users',],

passwords 配置项用于定义密码重置功能的相关设置。此文章不细说

3.登录控制器开发

login控制器有两种验证机制:

  1. 手动验证登录,auth 生成token【常用】
  2. 自动验证登录,生成token【注意密码】

手动验证登录

// 获取用户实例
$user = User::where('mobile', $request->mobile)->first();// 手动验证密码
if (!Hash::check($request->password, $user->password)) {return response()->json(['error' => '密码错误'], 401);
}// 生成Token的三种方式(任选其一)
// 方式1:直接通过用户实例生成
$token = JWTAuth::fromUser($user); // 方式2:使用auth辅助函数
$token = auth()->login($user); // 或者自定义claims
$token = JWTAuth::claims(['user_type' => $user->type,'exp' => now()->addDays(30)->timestamp // 自定义过期时间
])->fromUser($user); // 返回带Token的响应
return response()->json(['access_token' => $token,'token_type' => 'bearer','user' => auth()->user(),
]);

上述就是登录验证 和 获取token 分离

  1. auth 为laravel的认证系统,使用默认守卫进行生成token
  2. auth()->user() 可获取到登录的用户信息

自动验证登录

// 验证输入
$validator = Validator::make($request->all(), ['mobile' => 'required|string|size:11', // 假设手机号是11位'password' => 'required|string|min:6',]);if ($validator->fails()) {return response()->json(['status' => 'error','message' => '参数验证失败','errors' => $validator->errors()], 422);}// 使用手机号作为登录凭证
$credentials = $request->only('mobile', 'password');$token = Auth::guard('admin-api')->attempt(['mobile' => $mobile, 'password' => $password, 'state' => 1]);if($token){$user = Auth::guard('admin-api')->user();return $this->success('登录成功', ['token' => $token,'user' => $user,]);}else{return $this->error('您输入的账号或密码错误', 103);}

注意

使用 attempt 方法时,需要注意你的密码是否是用 Bcrypt 算法哈希,如果不是,则会有以下报错

This password does not use the Bcrypt algorithm.
在这里插入图片描述
原因Laravel 默认认证系统 Auth(包括 attempt() 方法)强制要求使用 Bcrypt 算法,只有Bcrypt 算法生成的密码,才能验证通过。

通过在 Hash Facade 上调用 make 方法来哈希密码

Hash::make($request->newPassword)

小结下:

  • 自动验证要求比较严格,但是也是有解决办法的。这里不过多说明,
  • 正常情况下。我是手动验证。然后生成token.。
  • 目前的遇到的验证,账号密码,手机号验证码等等。手动验证,灵活一点

4.前端构建请求

在这里插入图片描述

5.中间件补充

目录:app/Http/Middleware/UserCheckToken.php

<?phpnamespace App\Http\Middleware;use App\Http\Trait\ResponseJson;
use Closure;
use Tymon\JWTAuth\Facades\JWTAuth;class UserCheckToken
{use ResponseJson;public function handle($request, Closure $next){try{$user = auth()->user();if(!$user){return $this->error('用户未找到', 401);}}catch(\Exception $e){return $this->error('Token 验证失败', 401);}return $next($request);}}

创建中间件 UserCheckToken

auth()->user() 的作用

  • 验证请求携带有效的 JWT Token(Authorization: Bearer xxx)
  • JWT 会自动解析 Token还原用户信息

注意:

  1. 同一次请求中多次调用 auth()->user() 不会重复查询数据库,第一次查询数据库,第二次返回内存缓存
  2. 缓存持续到当前 HTTP 请求结束下次请求会重新解析 Token。

6. 路由配置中间件

Route::middleware([UserCheckToken::class])->group(function(){Route::get('/test', [TestController::class, 'index']);
});

将需要验证登录信息的接口,放在此中间件下即可。

上述即完整的用Jwt 实现用户的登录。里面有很多的知识点都可以进行扩展,可以实现很多强大的,自定义的需求。

相关文章:

Laravel 中使用 JWT 作用户登录,身份认证

什么是JWT&#xff1a; JWT 全名 JSON Web Token&#xff0c;是一种开放标准 (RFC 7519)。 用于在网络应用环境间安全地传输信息作为 JSON 对象。 它是一种轻量级的认证和授权机制&#xff0c;特别适合分布式系统的身份验证。 核心特点 紧凑格式&#xff1a;体积小&#x…...

Git安装

1、 下载Git https://git-scm.com/ 2、 双击【Git-2.44.0-64-bit.exe】安装&#xff1a; 2-1、 选择自定义安装目录&#xff1a;F:\software\Git 2-2、 一直点击next&#xff0c;直到安装成功。 2-3、 在git项目文件夹&#xff0c;右键出现Git GUI Here和Git Bash Here就说明成…...

bit与byte的区别与联系?

李升伟 整理 byte 和 bit 是计算机中常用的数据单位&#xff0c;它们的主要区别和联系如下&#xff1a; 1. 定义 bit&#xff08;比特&#xff09;&#xff1a;计算机中最小的数据单位&#xff0c;表示一个二进制位&#xff0c;值为0或1。 byte&#xff08;字节&#xff09…...

程序化广告行业(51/89):Cookie映射与移动设备ID映射解析

程序化广告行业&#xff08;51/89&#xff09;&#xff1a;Cookie映射与移动设备ID映射解析 在当今数字化营销的浪潮中&#xff0c;程序化广告已经成为企业精准触达目标客户的重要手段。作为一名对程序化广告充满兴趣的学习者&#xff0c;我希望通过这篇博客和大家一起深入探索…...

从吉卜力漫画到艺术创造:GPT-4o多种风格绘图Prompt大全

在3月底&#xff0c;GPT-4o掀起了一阵吉卜力绘图浪潮&#xff0c;大家纷纷输入一张图片&#xff0c;让4o模型进行风格化迁移&#xff0c;其中吉卜力风格的漫画在社交媒体上最为火热。在大家争议4o的训练数据是否侵权和4o背后的技术原理的时候&#xff0c;我们先来玩一玩&#x…...

48. 旋转图像

leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 先上下翻转再沿着对角线翻转 提示&#xff1a;小白个人理解&#xff0c;如有错误敬请谅解&#xff01; 二、外层配合操作 三、核心模式代码 代码如下&#xff1a; class S…...

【Linux篇】自主Shell命令行解释器

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 文章目录 1. 获取用户名的接口2. 等待用户输入接口3. 将上述代码进行面向对象式的封装4. 命令行解析5.…...

leetcode 2873. 有序三元组中的最大值 I

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 文章目录 题目描述题目剖析&信息挖掘解题思路方法一 暴力枚举法思路注意复杂度代码实现 方法二 公式拆分动态规划思路注意复杂度代码实现 题目描述 [2873] 有序三元…...

深度学习 Deep Learning 第14章 自编码器

深度学习 Deep Learning 第14章 自编码器 内容概要 本章深入探讨了自编码器&#xff08;Autoencoders&#xff09;&#xff0c;这是一种用于特征学习和降维的神经网络架构。自编码器通过编码器和解码器两个部分&#xff0c;将输入数据映射到一个内部表示&#xff08;编码&…...

全国产传感器的可靠性、MTBF计算、极限测试与加速寿命测试

全国产传感器的可靠性是指传感器在规定条件下和规定时间内完成规定功能的能力。它是衡量传感器性能的重要指标之一&#xff0c;直接影响传感器的使用寿命和系统稳定性。武汉利又德的小编来和大家分享一下关于全国产传感器的可靠性以及MTBF计算、极限测试与加速寿命测试的小知识…...

【算法中的数学】裴蜀定理(Bézout’s Identity)总结

裴蜀定理&#xff08;Bzout’s Identity&#xff09;总结 裴蜀定理是数论中的一个重要定理&#xff0c;描述了整数线性组合与最大公约数&#xff08;GCD&#xff09;之间的关系。 1. 裴蜀定理的内容 对于任意两个整数 a a a 和 b b b&#xff0c;设它们的最大公约数为 d …...

unity点击button后不松开通过拖拽显示模型松开后模型实例化

using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;[RequireComponent(typeof(Button))] // 确保脚本挂在Button上 public class DragButtonSpawner : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandle…...

计算机网络复习 吉林大学

1、信息交换的三种方式&#xff1a;电路交换&#xff0c;分组交换&#xff0c;报文交换。 从通信资源的分配角度来看&#xff0c;交换就是按照某种方式动态地分配传输线路的资源。 电路交换&#xff1a;&#xff08;星形结构替代全连接&#xff09; 电话交换机接通电话的方式…...

超级好用的小软件,连接电脑和手机。

将手机变成电脑摄像头的高效工具Iriun Webcam是一款多平台软件&#xff0c;能够将手机摄像头变成电脑的摄像头&#xff0c;通过简单的设置即可实现视频会议、直播、录制等功能。它支持Windows、Mac和Linux系统&#xff0c;同时兼容iOS和Android手机&#xff0c;操作简单&#x…...

【JavaScript】十三、事件监听与事件类型

文章目录 1、事件监听1.1 案例&#xff1a;击关闭顶部广告1.2 案例&#xff1a;随机点名1.3 事件监听的版本 2、事件类型2.1 鼠标事件2.1.1 语法2.1.2 案例&#xff1a;轮播图主动切换 2.2 焦点事件2.2.1 语法2.2.2 案例&#xff1a;模拟小米搜索框 2.3 键盘事件2.3.1 语法2.3.…...

微服务架构技术栈选型避坑指南:10大核心要素深度拆解

微服务架构的技术栈选型直接影响系统的稳定性、扩展性和可维护性。以下从10大核心要素出发&#xff0c;结合主流技术方案对比、兼容性评估、失败案例及优化策略&#xff0c;提供系统性选型指南。 1. 服务框架与通信 关键考量点 扩展性&#xff1a;框架需支持定制化扩展&#x…...

虚拟试衣间微信小程序解决方案

目录 项目名称: 云尚衣橱 核心功能模块: 技术栈选型: 架构设计概览: 详细功能点实现思路: 数据库设计 (MongoDB 示例): 开发步骤建议: 关键注意事项和挑战: 项目名称: 云尚衣橱 核心功能模块: 用户系统 (User System) 我的衣柜 (My Wardrobe) 虚拟试衣间 (Vir…...

C++STL——容器-vector(含部分模拟实现,即地层实现原理)(含迭代器失效问题)

目录 容器——vector 1.构造 模拟实现 2.迭代器 模拟实现&#xff1a; ​编辑 3.容量 模拟实现&#xff1a; 4.元素的访问 模拟实现 5.元素的增删查改 迭代器失效问题&#xff1a; 思考问题 【注】&#xff1a;这里的模拟实现所写的参数以及返回值&#xff0c;都是…...

MoLe-VLA:通过混合层实现的动态跳层视觉-语言-动作模型实现高效机器人操作

25年3月来自南京大学、香港理工、北大和香港科技大学的论文“MoLe-VLA: Dynamic Layer-skipping Vision Language Action Model via Mixture-of-Layers for Efficient Robot Manipulation”。 多模态大语言模型 (MLLM) 在理解复杂语言和视觉数据方面表现出色&#xff0c;使通用…...

《数字图像处理》教材寻找合作者

Rafael Gonzalez和Richard Woods所著的《数字图像处理》关于滤波器的部分几乎全错&#xff0c;完全从零开始写&#xff0c;困难重重。关于他的问题已经描述在《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》。 现寻找能够共同讨论、切磋、…...

uni-app 框架 调用蓝牙,获取 iBeacon 定位信标的数据,实现室内定位场景

背景&#xff1a;最近需要对接了一个 叫 iBeacon 定位信标 硬件设备&#xff0c;这个设备主要的作用是&#xff0c;在信号不好的地方&#xff0c;或者室内实现定位&#xff0c;准确的找到某个东西。就比如 地下停车场&#xff0c;商城里&#xff0c;我们想知道这个停车场的某个…...

Java面试黄金宝典29

1. 什么是普通索引和唯一性索引 定义&#xff1a; 普通索引&#xff1a;是最基本的索引类型&#xff0c;它为数据表中的某一列或多列建立索引&#xff0c;以加快数据的查询速度。它不限制索引列的值重复&#xff0c;允许存在多个相同的值。唯一性索引&#xff1a;在普通索引的基…...

C语言常见3种排序

主要是三种排序方法&#xff1a;冒泡排序、选择排序、插入排序。 文章目录 一、冒泡排序 1.代码&#xff1a; 2.工作原理&#xff1a; 3.具体过程&#xff1a; 二、选择排序 1.代码 2. 工作原理 3.具体过程&#xff1a; 三、插入排序 1.代码 2.工作原理 3.具体过程 总结 一、…...

Nyquist插件基础:LISP语法-自定义函数

1 Nyquist插件基础&#xff1a;LISP语法-自定义函数 在 Nyquist 里&#xff0c;自定义函数能够让你把特定的操作封装起来&#xff0c;实现代码复用和逻辑模块化。下面详细介绍如何在 Nyquist 中定义和使用自定义函数。 1.1.1 1. 基本函数定义 在 Nyquist 中使用 defun 来定义…...

Visual-RFT:视觉强化微调

文章目录 速览摘要1. 引言2. 相关工作大型视觉语言模型&#xff08;LVLMs&#xff09;强化学习 3. 方法3.1. 初步带可验证奖励的强化学习DeepSeek R1-Zero和GRPO 3.2. Visual-RFT3.2.1. 视觉感知中的可验证奖励检测任务中的IoU奖励分类任务中的CLS奖励 3.2.2 数据准备 4. 实验4…...

快速入手-基于DRF的过滤、分页、查询配置(十五)

1、过滤需要安装插件 pip install django-filter 2、注册 INSTALLED_APPS [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages",…...

最新Spring Security实战教程(八)Remember-Me实现原理 - 持久化令牌与安全存储方案

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…...

gcc 链接顺序,静态库循环依赖问题

链接过程由链接器 ld 负责。通常 GCC 间接驱动之。 越底层的库&#xff0c;在链接命令行中的位置应越靠后。 文章目录 链接过程※ 但是对于静态库&#xff0c;链接器仅提取当前未解析符号所需的对象文件&#xff0c;未使用的对象文件会被丢弃。静态库&#xff08;.a&#xff09…...

linux内核漏洞检测利用exp提权

案例一dirtycow&#xff08;CVE-2016-5159&#xff09; 有个前置知识就是 获取liunx的内核 hostnamectl uname -a 然后这个内核漏洞进行提权的步骤也是和手工win进行提权差不多 也是需要使用辅助工具在本地进行辅助检测 然后去nomi-sec/PoC-in-GitHub&#xff1a; &#…...

【学Rust写CAD】21 2D 点(point.rs)

源码 //matrix/point.rs use std::ops::Mul; use super::algebraic_units::{Zero, One}; use super::generic::Matrix;/// 点坐标结构体 #[derive(Debug, Clone, Copy, PartialEq)] pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y>…...

Jmeter的压测使用

Jmeter基础功能回顾 一、创建Jmeter脚本 1、录制新建 &#xff08;1&#xff09;适用群体&#xff1a;初学者 2、手动创建 &#xff08;1&#xff09;需要了解Jmeter的常用组件 元件&#xff1a;多个类似功能组件的容器&#xff08;类似于类&#xff09; 各元件作用 组件…...

C语言--统计输入字符串中的单词个数

输入 输入&#xff1a;大小写字母以及空格&#xff0c;单词以空格分隔 输出&#xff1a;单词个数 代码 如果不是空格且inWord0说明是进入单词的第一个字母&#xff0c;则单词总数加一。 如果是空格&#xff0c;证明离开单词&#xff0c;inWord 0。 #include <stdio.h&g…...

《雷神之锤 III 竞技场》快速求平方根倒数的计算探究

1. 《雷神之锤 III 竞技场》快速求平方根导数源代码 此处先列出其源代码&#xff0c;这段代码的目标是计算一个浮点数平方根的导数&#xff0c;也就是如下形式&#xff1a; f ( x ) 1 x f(x) \frac{1}{\sqrt{x}} f(x)x ​1​这段代码可以说非常难以理解&#xff0c;尤其是 …...

深入解析 Java 8 Function 接口:函数式编程的核心工具

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Java 8 引入的 java.util.function.Function 接口是函数式编程范式的核心组件之一&#xff0c;本文将全面解析其使用方法&#xff0c;并通过丰富的代码示例演…...

软件重构与项目进度的矛盾如何解决

软件重构与项目进度之间的矛盾可以通过明确重构目标与范围、采用渐进式重构策略、优化项目管理流程、提高团队沟通效率、建立重构意识文化等方式解决。其中&#xff0c;采用渐进式重构策略尤为关键。渐进式重构是指在日常开发过程中&#xff0c;以小步骤持续进行重构&#xff0…...

redis的geo结构实现[附近商铺]功能

先上结论 geo地理位置算出来是不准的 实现思路 redis6.2支持了经纬度数据格式 支持经纬度检索 需要将redis升级 否则会报错不支持命令 pom文件如果spring-data-redis是2.7.9的boot版本则要改一下支持geo: <dependency><groupId>org.springframework.boot</g…...

W3C XML Schema 活动

W3C XML Schema 活动 概述 W3C XML Schema(XML Schema)是万维网联盟(W3C)定义的一种数据描述语言,用于定义XML文档的结构和约束。XML Schema为XML文档提供了一种结构化的方式,确保数据的一致性和有效性。本文将详细介绍W3C XML Schema的活动,包括其发展历程、主要特点…...

深入解析C++类:面向对象编程的核心基石

一、类的本质与核心概念 1.1 类的基本定义 类是将**数据&#xff08;属性&#xff09;与操作&#xff08;方法&#xff09;**封装在一起的用户自定义类型&#xff0c;是面向对象编程的核心单元。 // 基础类示例 class BankAccount { private: // 访问控制string owner; …...

MySQL 复制与主从架构(Master-Slave)

MySQL 复制与主从架构&#xff08;Master-Slave&#xff09; MySQL 复制与主从架构是数据库高可用和负载均衡的重要手段。通过复制数据到多个从服务器&#xff0c;既可以实现数据冗余备份&#xff0c;又能分担查询压力&#xff0c;提升系统整体性能与容错能力。本文将详细介绍…...

2025年上软考——【数据库系统工程师】考前60天冲刺学习指南!!!

距离2025上半年“数据库系统工程师”考试已经不足两个月了&#xff0c;还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前60天学习指南。本指南包括考情分析、学习规划、冲刺攻略三个部分&#xff0c;可以参考此指南进行最后的复习要…...

如果数据包的最后一段特别短,如何处理?

在处理TCP粘包/拆包时&#xff0c;如果最后一个数据段特别短&#xff08;例如仅包含部分包头部或部分数据体&#xff09;&#xff0c;需要通过合理的缓冲区和协议设计来确保数据完整性。以下是具体处理方案&#xff1a; 1. 缓冲区管理&#xff1a;保留不完整数据 核心思想&…...

vue修饰符

在 Vue 中&#xff0c;修饰符是一种特殊的后缀&#xff0c;用于改变指令的默认行为 stop <template><div><h2>vue修饰符</h2><div class"box" click"boxClikc"><button click"btnClick">按钮</button&…...

Redis-06.Redis常用命令-列表操作命令

一.列表操作命令 LPUSH key value1 [value2]&#xff1a; LPUSH mylist a b c d: LRANGE key start stop&#xff1a; LRANGE mylist 0 -1&#xff1a; lrange mylist 0 2&#xff1a; d c b RPOP KEY&#xff1a;移除并返回最后一个元素 RPOP list a LLEN key…...

LTSPICE仿真电路:(二十四)MOS管推挽驱动电路简单仿真

1.Mos管驱动电路基本的拓扑 前面在十一篇的时候学习了MOS管的简单的应用&#xff0c; 这一篇继续补充MOS管的驱动电路。 这个电路应该是最基本的电路仿真&#xff0c;先看电路以及仿真结果&#xff0c;以下仿真结果的电压皆为信号发生器提供的波形图。 看仿真结果比较明了&a…...

GFS论文阅读笔记

文章目录 摘要一、引言二、设计总览2.1、假设2.2、接口2.3、架构2.4 单Master2.5 Chunk大小2.6 元数据2.7 一致性模型 3 系统交互3.1 租约和变更顺序3.2 数据流3.3 原子性的操作&#xff1a;Record append3.4 快照-SNAPSHOT 4. master操作4.1 namespace的管理与锁定4.2 副本的分…...

6. 王道_网络协议

1 网络协议和网络模型 2 TCP/IP协议族概览 2.1 四层模型的各层实体 2.2 协议数据单元的转换 2.3 常见协议以及分层 2.4 ifconfig 2.5 本地环回设备 3 以太网 3.1 以太网和交换机 3.2 以太网帧 MAC地址大小 48位 6字节 IP地址 32位 4字节 port 16位 2字节 3.3 ARP协议 4 IP协…...

《K230 从熟悉到...》颜色识别

《K230 从熟悉到...》颜色识别 颜色识别的基本原理 《庐山派 K230 从熟悉到...》颜色识别 颜色识别是计算机视觉中的重要组件&#xff0c;它允许算法在图像中检测、识别和分类不同颜色。 颜色识别的基本原理 颜色识别的核心是通过分析图像中像素点的颜色信息&#xff0c;从…...

实时内核稳定性 - scheduling while atomic

scheduling while atomic问题 根因:未成对使用获取cpu_id的函数[ 291.881071][ 0] [XW]: type=0x00000003 cpuid=4 time=1725877230 subj...

数据编排与Dagster:解锁现代数据管理的核心工具

在数据驱动的时代&#xff0c;如何高效管理复杂的数据管道、确保数据质量并实现团队协作&#xff1f;本文深入探讨数据编排的核心概念&#xff0c;解析其与传统编排器的差异&#xff0c;并聚焦开源工具Dagster如何以“资产为中心”的理念革新数据开发流程&#xff0c;助力企业构…...

stc8g1k08a定时读取内部1.2v电压值发送到串口1

1189mv #include "stc8g.h"void t0_timer_init(){EA 1;//总中断控制位,启用中断//启用定时器0中断ET0 1;//允许t0中断AUXR | 0x80; //定时器时钟1T模式 t0不频 t1 12分频TMOD & 0xF0; //设置定时器模式TL0 0xCD; //设置定时初始值 205TH0 0xD4; …...