Java——令牌技术
目录
一、何为令牌
JWT令牌
介绍
JWT组成
二、JWT用于验证用户登录
三、JWT令牌生成和校验
简单用法
1.创建生成密钥的方法
2.接着添加过期时间,密钥,BASE64解码密钥的属性以及生成token的方法,合并上面生成密钥的方法,下面是完整代码。
3.当然也可以写解析token的方法进行验证,通过对称密钥KEY进行对token进行验证,得到载荷部分:
进阶用法
1.创建密钥库文件(JKS)
2.读取JKS密钥库并进行签名,生成token
3.验证Token
一、何为令牌
令牌其实就是一个用户身份的标识,其本质上就是一个字符串。
比如我们出行在外,会带着自己的身份证,需要验证身份时,就要身份证了,而身份证不能伪造,可以辨别真假。
服务器具备生成令牌和验证令牌的能力。
JWT令牌
令牌本质就是一个字符串,它的实现方式有很多种,我们采用一个JWT令牌来实现。
介绍
JWT全称:JSON Web Toekn
官网:https://jwt.io/
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),用于客户端和服务器之间传递安全可靠的信息。
其本质是一个token,是一种紧凑的URL安全方法。
JWT组成
JWT由三部分组成,使用(.)分隔,比如:aaaaa.bbbbb.cccc,这三部分为:
- Header(头部):头部包括令牌类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
- Payload(负载):负载部分是存放有效信息的地方,里面是一些自定义的内容。比如:{"userId":"123","userName":"zhangsan"},也可以存在jwt提供的现场字段,比如exp(过期时间戳)等 。注意:此部分不建议存放敏感信息,因为此部分能够被解码还原原始内容
- Signature(签名):此部分用于防止jwt内容被篡改,确保安全性。
防止被篡改,而不是防止被解析。
jwt之所以安全,就是因为最后的签名。jwt当中任何一个字符被篡改,整个令牌都会校验失效。这就好比我们的身份证,之所以能标识一个人的身份,是因为不能被篡改,而不是因为内容加密。
二、JWT用于验证用户登录
具体流程如下
1.用户登录(生成JWT)
(1)用户提交凭证
* 场景:用户输入用户名和密码,点击登录。
(2)认证服务器验证凭证
验证流程:
* 检查用户名和密码是否匹配数据库中的记录
* 确认用户状态(是否被禁用)
(3)生成JWT
JWT结构:
* Header:声明算法类型(如"alg": "RS256", "typ": "JWT"}
).
* Payload:包含用户身份和权限信息({"sub": "user123", "roles": ["user"], "exp": 1720000000}
)。
* Signature:使用私钥对头部和载荷签名 (如 RSA-SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), privateKey)
)。
2.客户端存储并携带JWT
客户端把令牌存储起来,可以存储在Cookie中,也可以存储在其他的存储空间。
3.服务器验证JWT
(1)解析JWT结构
(2)验证签名
非对称加密流程:从认证服务器获取公钥,使用公钥重新计算签名,比对JWT中的签名是否一致。同时验证令牌是否有效,有效就说明执行了登录操作,否则就是未登录。
总结:
1.用户登录请求,经过负载均衡,把请求转给了第一台服务器,第一台服务器进行账号密码验证,验证成功后,生成一个令牌,并返回给客户端。
2.客户端收到令牌后,把令牌存储起来,可以存储在Cookie中,也可以存储在其他的存储空间。
3.用户登录成功后,携带令牌继续执行查询操作,比如查询博客列表,此时请求转发到了第二台机器 ,第二台机器会先进行权限验证操作。服务器验证令牌是否有效,就说明执行了登录操作,如果令牌是无效的,就说明用户之前未执行登录操作。
三、JWT令牌生成和校验
在使用之前先引入相关的依赖:
放在<dependencies> </dependencies>标签下:
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version></dependency><!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is
preferred --><version>0.11.5</version><scope>runtime</scope></dependency>
简单用法
主要思想是利用生成的对称密钥对token进行签名(加密)和验证(解密)。
下面代码主要利用测试类进行讲解:
1.创建生成密钥的方法
@Testpublic void genKey(){//随机生成一个key,HS256算法生成 。H256是一种堆成密钥算法SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);//利用BASE64对密钥进行编码String key = Encoders.BASE64.encode(secretKey.getEncoded());System.out.println(key);}
运行后生成结果如下:
B2S6Xk0/9aDxArJCaVWEAa2moixi3RVx+O8oraRQ3cQ=
2.接着添加过期时间,密钥,BASE64解码密钥的属性以及生成token的方法,合并上面生成密钥的方法,下面是完整代码。
@SpringBootTest
public class JWTUtilTest {//过期毫秒时长10年public static final long Expiration =10 * 365 * 24 * 60 * 60 * 1000L;;//密钥,就是利用下面genKey()方法生成的密钥private static final String secretSrting =
"B2S6Xk0/9aDxArJCaVWEAa2moixi3RVx+O8oraRQ3cQ="; //生成安全密钥,BASE64解码private static final SecretKey KEY =Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretSrting));//生成token@Testpublic void genToken(){//生成载荷部分Map<String,Object> claim = new HashMap<>();claim.put("id",1);claim.put("username","zhangsan");//自定义信息String jwt = Jwts.builder().setClaims(claim)//自定义内容(负载).setExpiration(new Date(System.currentTimeMillis()+Expiration))//设置过期时间.signWith(KEY) //密钥签名.compact();System.out.println(jwt);}//生成密钥@Testpublic void genKey(){//随机生成一个key,HS256算法生成SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);String key = Encoders.BASE64.encode(secretKey.getEncoded());System.out.println(key);}}
运行genToken()方法,得到token字符串。
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MjA2MTAwMTY0OX0.
7eFIjaWuKEZTFnBlrVgdVtplVowslGnd_VHenj3qQpU
通过得到的token和密钥到官网去验证JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).https://jwt.io/结果如下:
3.当然也可以写解析token的方法进行验证,通过对称密钥KEY进行对token进行验证,得到载荷部分:
//校验token信息@Testpublic void parseToken(){String token ="eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MjA2MTAwMTY0OX0.7eFIjaWuKEZTFnBlrVgdVtplVowslGnd_VHenj3qQpU";//利用对称密钥再进行验证tokenJwtParser bulid = Jwts.parserBuilder().setSigningKey(KEY).build();Claims body = bulid.parseClaimsJws(token).getBody();System.out.println(body);}
运行结果如下:
进阶用法
处于安全考虑,我们可以通过RSA算法生成非对称密钥,利用私钥签名,利用公钥进行验证,同时通过还需要这对对密钥进行管理,将其管理在密钥库中。
下面是实现步骤:
1.创建密钥库文件(JKS)
我们需要把生成这对对 公钥-私钥 ,并将其保存在密钥库中。可以使用keytool命令创建JKS文件(在idea中的终端运行)。
命令如下:
keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -keystore mykeystore.jks -storepass keystorepass -validity 365
命令解析:
keytool -genkeypair \-alias myalias \ # 密钥条目别名(自定义标识)-keyalg RSA \ # 密钥算法(RSA 非对称加密)-keysize 2048 \ # 密钥长度(2048 位,安全推荐值)-keystore mykeystore.jks \# 密钥库文件名(保存路径)-storepass keystorepass \ # 密钥库密码(保护整个文件)-validity 365 # 证书有效期(365 天)
此命令用于生成一个java密钥库(JKS文件),并在其中创建一个RSA密钥(非对称)对。
运行后keytool会提示输入相关信息(学习阶段随便填即可):
您的名字与姓氏是什么?[Unknown]: localhost # 建议填域名(如服务器域名或本地测试填 localhost)
您的组织单位名称是什么?[Unknown]: MyOrg # 组织单位(可选)
您的组织名称是什么?[Unknown]: MyCompany # 组织名称(可选)
您所在的城市或区域名称是什么?[Unknown]: Beijing # 城市(可选)
您所在的省/市/自治区名称是什么?[Unknown]: Beijing # 省份(可选)
该单位的双字母国家/地区代码是什么?[Unknown]: CN # 国家代码(如 CN 表示中国)
CN=localhost, OU=MyOrg, O=MyCompany, L=Beijing, ST=Beijing, C=CN是否正确?[否]: 是 # 确认信息
输入完后,会提示输入口令,注意这个口令是和后面获取私钥的时候挂钩的,我们可以直接按回车和密钥库密码一样,同时也可以自定义。
输入完后,项目里面会生成jks文件,我们可以剪贴到resource目录下,后面需要该文件路径。
2.读取JKS密钥库并进行签名,生成token
下面是详细代码:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.util.Date;
import java.util.Map;public class JWTUtils {// EYSTORE_PASSWORD(密钥库密码):用于保护整个 JKS 密钥库文件。在加载密钥库时需要使用此密码。//配置密钥库的路径、别名。访问密码private static final String KETSTORE_PATH = "src/main/resources/mykeystore.jks";//密钥库密码private static final String KEYSTORE_PASSWORD = "keystorepass";//密钥别名private static final String KEY_ALIAS = "myalias";//访问私钥的密码(刚刚自己输入的口令)private static final String KEY_PASSWORD = "123456";//从jks文件中加载私钥private static Key getPrivateKey() throws Exception {KeyStore keyStore = KeyStore.getInstance("JKS");try (FileInputStream keyStoreStream = new FileInputStream(KETSTORE_PATH)){keyStore.load(keyStoreStream, KEYSTORE_PASSWORD.toCharArray());}return keyStore.getKey(KEY_ALIAS, KEY_PASSWORD.toCharArray());}//生成TOKENpublic static String generateToken(Map<String,Object> claim)throws Exception{Key privateKey = getPrivateKey();return Jwts.builder().setClaims(claim)//自定义内容(负载).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis()+60*60*1000)) //过期时间1小时.signWith(privateKey, SignatureAlgorithm.RS256) //使用私钥签名,相当于用私钥加密.compact();}
}
3.验证Token
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PublicKey;
import java.util.HashMap;
import java.util.Map;public class JwtValidator {//获取公钥,公钥无需密码去访问直接获取即可private static PublicKey getpublicKey()throws Exception{KeyStore keyStore = KeyStore.getInstance("JKS");try (FileInputStream keyStoreStream = new FileInputStream("src/main/resources/mykeystore.jks")) {keyStore.load(keyStoreStream,"keystorepass".toCharArray());}return keyStore.getCertificate("myalias").getPublicKey();}//验证JWT并解析public static Claims validateToken(String token)throws Exception{PublicKey publicKey = getpublicKey();return Jwts.parserBuilder().setSigningKey(publicKey) //使用公钥验证.build().parseClaimsJws(token)//解析jwt.getBody();}//运行main方法执行程序public static void main(String[] args) throws Exception {//写入相关参数Map<String,Object> claim = new HashMap<>();claim.put("id",1);claim.put("username","zhangsan");String token = JWTUtils.generateToken(claim);
// System.out.println(token);Claims claims = validateToken(token);System.out.println(claims);}
}
运行结果:
以上是JWT令牌的讲解,喜欢的支持一下,感谢观看!!!
相关文章:
Java——令牌技术
目录 一、何为令牌 JWT令牌 介绍 JWT组成 二、JWT用于验证用户登录 三、JWT令牌生成和校验 简单用法 1.创建生成密钥的方法 2.接着添加过期时间,密钥,BASE64解码密钥的属性以及生成token的方法,合并上面生成密钥的方法,下面…...
【含文档+PPT+源码】基于Python校园跑腿管理系统设计与实现
项目介绍 本课程演示的是一款基于Python校园跑腿管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…...
Spring AI Alibaba - Milvus 初体验,实现知识库效果
先看效果 数据被存储在 milvus 中,包括原始数据和向量数据。 大模型使用向量化数据的回答: 环境准备 安装 milvus Milvus 是一款专为向量相似性搜索设计的高性能开源数据库。 本地测试环境可以直接 Standalone 模式安装,需要用到 docke…...
arcpy列表函数的应用
arcpy.ListDatasets() 该函数用于列出指定工作空间中的所有数据集(如要素数据集、栅格数据集等)。 语法: python arcpy.ListDatasets(wild_cardNone, feature_typeNone) • wild_card:用于筛选数据集名称的通配符。 • feat…...
上位机知识篇---时钟分频
文章目录 前言 前言 本文简单介绍了一下时钟分频。时钟分频(Clock Division)是数字电路设计中常见的技术,用于将高频时钟信号转换为较低频率的时钟信号,以满足不同模块的时序需求。它在处理器、FPGA、SoC(片上系统&am…...
Redis的两种持久化方式:RDB和AOF
Redis持久化概述 Redis作为内存数据库,数据存储在内存中。为了保证数据在服务器重启或宕机时不丢失,Redis提供了两种持久化方案: RDB(Redis Database):定时生成内存快照 AOF(Append Only File&…...
1位的推理框架bitnet.cpp
源码:https://github.com/microsoft/BitNet bitnet.cpp 技术解析 bitnet.cpp 是专为 低精度大语言模型(如 BitNet b1.58) 设计的官方推理框架,其核心特性如下: 一、架构优势 全栈优化引擎 提供高度优化…...
教育领域的AIGC革命:构建多模态智能教学系统
一、智能教育系统技术架构 1.1 教育场景技术需求 教学环节 传统痛点 AIGC解决方案 课程设计 耗时耗力,创新不足 跨学科教案自动生成 课堂互动 单向传授,参与度低 多模态交互式虚拟教师 作业批改 重复劳动,反馈延迟 全自动批改与个性化评语 学…...
Simulink 数据存储机制:Base Workspace、Model Workspace 与 Data Dictionary 的核心区别
1. 核心定位与设计目标 存储方式本质核心设计目标Base WorkspaceMATLAB全局内存空间临时数据交互,快速原型开发Model Workspace模型私有数据容器模型数据隔离,防止命名冲突Data Dictionary专业数据管理文件(.sldd)复杂系统数据治理,支持团队…...
TI---UART通信
一、SysConfig 中 UART 配置的核心参数与生成逻辑 1. 基础参数配置(图形化界面) 配置项功能说明生成代码影响模式选择主机模式(Master)/ 从机模式(仅部分芯片支持,如 UART 作为 I2C 桥接)生成…...
spark总结
文章目录 一 spark简介1.1 什么是spark1.2 spark运行过程1.2.1 组成1.2.2 过程1.2.3 事例(词频统计WordCount程序) 1.3 spark运行模式1.4 pyspark 二 SparkCore2.1 RDD介绍2.2 RDD编写2.3 RDD算子2.4 RDD的持久化2.4.1 为什么需要缓存和检查点机制&#…...
【随笔】地理探测器原理与运用
文章目录 一、作者与下载1.1 软件作者1.2 软件下载 二、原理简述2.1 空间分异性与地理探测器的提出2.2 地理探测器的数学模型2.21 分异及因子探测2.22 交互作用探测2.23 风险区与生态探测 三、使用:excel 一、作者与下载 1.1 软件作者 作者: DOI: 10.…...
补码底层逻辑探讨
在计算机里面以二进制进行存储,二进制并不能区分正负数 为了处理负数,人们想了很多办法 1.原码 首先,很直观的区分方法就是设置一个flag 在二进制前面加一个符号位,0是正、1是负 但是在电路里面处理这样的信号却很复杂&#…...
第二大脑-个人知识库
原文链接:https://i68.ltd/notes/posts/20250407-llm-person-kb/ Quivr-第二大脑一样的个人助手,利用AI技术增强个人生产力 将 GenAI 集成到您的应用程序中的个性化 RAG,专注于您的产品而非 RAG项目仓库:https://github.com/QuivrHQ/quivr Star:37.7k官网:https:/…...
泰勒展开概念解释(图优化SLAM中非线性系统的线性处理)
1. 泰勒展开 泰勒展开是一种用多项式近似复杂函数的数学方法,其核心思想是通过函数在某一点的各阶导数信息,构建一个多项式来逼近原函数,即通过函数在某一点x0的各阶导数值,构造一个多项式 P(x),使得该多项式在 x0 附近与原函数 f(x) 的值及其导数尽可能匹配,数学形式为…...
CANape与MATLAB数据接口技术详解
目录 CANape与MATLAB数据接口技术详解 一、数据互操作背景与意义 1.1 汽车电子开发中的测量需求 1.2 技术标准演进分析 二、CANape数据导出深度解析 2.1 MDF文件结构说明 2.2 转换流程优化建议 三、MATLAB数据处理进阶技术 3.1 数据质量评估脚本 3.2 数据可视化增强方…...
per-task affinity 是什么?
Per-Task Affinity(任务级CPU亲和性)详解 Per-Task Affinity 是 Linux 调度器提供的一种机制,允许将单个任务(进程/线程)绑定到特定的 CPU 核心(或核心集合)上运行,从而优化性能、减…...
基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术
摘要:随着机器人技术的飞速发展,对运动控制系统的性能要求日益严苛。本文聚焦于基于先进MCU(微控制单元)的机器人运动控制系统设计,深入剖析其理论基础、实践方法与前沿技术。以国科安芯的MCU芯片AS32A601为例…...
Network.framework 的引入,不是为了取代 URLSession
Network.framework 的引入,不是为了取代 URLSession 如果你感觉 Network.framework 的引入, 可能是为了取代 URLSession, 那你就大错特错了!这里需要非常准确地区分一下: 🔵 Network.framework 不是为了取代 URLSession。 &…...
gradle-缓存、依赖、初始化脚本、仓库配置目录详解
1.启用init.gradle文件的方法 在命令置顶文件,例如gradle --init-script yourdir/init.gradle -q taskName,你可以多次输入此命令来制定多个init文件把init.gradle文件放到USER_HOME/.gradle/目录下把以.gradle结尾的文件放到USER_HOME/.gradle/.init.d/目录下把以…...
提示词的神奇魔力——如何通过它改变AI的输出
一、引言:初识AI的惊艳与迷茫 最近这段时间,我像很多人一样,一头扎进了生成式AI的世界,尝试使用各种工具,从文字助手到图像生成器。一开始,我被它们的能力深深震撼,感觉就像突然拥有了一个无所…...
零基础上手Python数据分析 (24):Scikit-learn 机器学习初步 - 让数据预测未来!
写在前面 在前面的学习中,我们已经掌握了使用 Python、Pandas、NumPy、Matplotlib 和 Seaborn 进行数据处理、分析和可视化的全套核心技能。我们学会了如何从数据中提取信息、清洗数据、整合数据、探索数据模式并将其可视化呈现。 现在,我们站在了一个新的起点。数据分析不仅…...
React 与 Vue 虚拟 DOM 实现原理深度对比:从理论到实践
在现代前端开发中,React 和 Vue 作为最流行的两大框架,都采用了虚拟 DOM(Virtual DOM) 技术来优化渲染性能。虚拟 DOM 的核心思想是通过 JavaScript 对象模拟真实 DOM,减少直接操作 DOM 的开销,从而提高页面…...
结合五层网络结构讲一下用户在浏览器输入一个网址并按下回车后到底发生了什么?
文章目录 实际应用第一步:用户在浏览器输入 www.baidu.com 并按下回车1. 浏览器触发域名解析(DNS查询) 第二步:DNS请求的逐层封装与传输1. 应用层(DNS协议)2. 传输层(UDP协议)3. 网络…...
关于Code_流苏:商务合作、产品开发、计算机科普、自媒体运营,一起见证科技与艺术的交融!
Code_流苏 🌿 名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 🌟 欢迎来到Code_流苏的CSDN主页 —— 与我一起&…...
Webpack模块打包工具
1. 认识webpack的基本用法步骤创建项目->下载webpack webpack-cli -> npm init -y -> package.json的scripts中配置webpack默认打包入口:src/index.js默认打包出口: dist/main.js2. 认识webpack.config.js的基本配置loader -> 打包css,less…...
crossOriginLoading使用说明
1. 说明 此配置用于控制 Webpack 动态加载的代码块(chunk)(例如代码分割或懒加载的模块)在跨域(不同域名)加载时的行为。它通过为动态生成的 <script>标签添加 crossorigin 属性,确保符合…...
Linux系统性能调优技巧分享
在数字化时代,Linux 系统以其开源、稳定、高效的特性,成为服务器、云计算、物联网等领域的核心支撑。然而,随着业务规模的扩大和负载的增加,系统性能问题逐渐凸显。掌握 Linux 系统性能调优技巧,不仅能提升系统运行效率,还能降低运维成本。下面从多个方面介绍实用的性能调…...
在Windows11中配置Git+SSH环境,本此实践使用Gitee(码云),方法同样适用于其它绝大部分Git服务
1.下载并安装Git 进入官网下载 Git - Downloading Package 选择下载Standalone Installer安装包,看自己电脑是64-bit还是32-bit(一般都是64-bit) 双击安装包进行安装,Next 这里可以自定义安装路径 这里可以勾选添加桌面快捷方式…...
【软考-架构】14、软件可靠性基础
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 软件可靠性基本概念软件可靠性建模软件可靠性管理软件可靠性设计N版本程序设计恢复块设计(动态冗余)双机容错技术、集群技术负载均衡软件可靠性测试…...
怎样理解ceph?
Ceph 是一个开源的、高度可扩展的 分布式存储系统,设计用于提供高性能、高可靠性的对象存储(Object)、块存储(Block)和文件存储(File)服务。它的核心思想是通过去中心化的架构和智能的数据分布策…...
《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用
智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用 引言 随着人工智能技术的飞速发展,智能Agent与模型上下文协议(MCP)的应用场景越来越广泛。本报告将详细介绍如何基于Python Flask框架构建一个智能应用&…...
Pygame字体与UI:打造游戏菜单和HUD界面
Pygame字体与UI:打造游戏菜单和HUD界面 在现代游戏中,用户界面(UI)是玩家与游戏互动的重要桥梁。一个精心设计的UI不仅能够提升游戏的视觉效果,还能增强玩家的游戏体验。Pygame作为一个强大的游戏开发库,提供了丰富的工具和方法来创建和管理UI元素。本文将详细介绍如何使…...
游戏引擎学习第246天:将 Worker 上下文移到主线程创建
回顾并为今天的工作做准备 关于GPU驱动bug的问题,目前本地机器上没有复现。如果有问题,昨天的测试就应该已经暴露出来了。当前演示的是游戏的过场动画,运行正常,使用的是硬件渲染。 之前使用软件渲染时没有遇到太多问题ÿ…...
系统设计(2)—Redis—消息队列—数据库—熔限降
Redis 缓存设计 在高并发系统中,缓存是提升性能、减轻后端负载的杀手锏。Redis 作为内存级的高性能缓存数据库,被广泛应用于各类系统设计中。利用 Redis,将热点数据存储在内存中,可以加速读写并大幅降低对后端关系型数据库的直接…...
第十六届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学 A 组
比赛还没有开始,竟然忘记写using namespace std; //debug半天没看明白 (平时cv多了 然后就是忘记那个编译参数,(好惨的开局 编译参数-stdc11 以下都是赛时所写代码,赛时无聊时把思路都打上去了(除了倒数第二题&#…...
HiSpark Studio如何使用Trae(Marscode)插件
引言 我现在非常喜欢使用编程辅助插件,用的最多的是Trae(以前叫Marscode)。以前华为的DevEco Device Tools是基于VSCode的,直接使用官方的插件市场就可以安装了。现在海思提供了自己的HiSpark Studio,比原来的Device …...
Netmiko连接池与长连接优化
背景与原理 在网络自动化中,频繁创建和断开 SSH 连接会带来以下问题: 性能损耗:每次连接需经历 TCP 握手、SSH 协商、用户认证等流程,耗时约 1~3 秒。资源浪费:设备端可能限制并发连接数,频繁连接易触发阈…...
10:00面试,10:08就出来了,面试问的问题太。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,这…...
从基础到实战的量化交易全流程学习:1.2 金融市场基础
从基础到实战的量化交易全流程学习:1.2 金融市场基础 在量化交易领域,扎实的金融市场基础是策略开发与风险控制的核心支撑。本文将从交易品种、市场机制、监管合规三方面展开,结合市场特性、真实数据案例及实践要点进行系统化解析,…...
游戏状态管理:用Pygame实现场景切换与暂停功能
游戏状态管理:用Pygame实现场景切换与暂停功能 在开发游戏时,管理游戏的不同状态(如主菜单、游戏进行中、暂停等)是非常重要的。这不仅有助于提升玩家的游戏体验,还能使代码结构更加清晰。本文将通过一个简单的示例,展示如何使用Pygame库来实现游戏中的场景切换和暂停功…...
数据资产价值及其实现路径-简答题回顾
1. 简述数据资产的定义及其特征。 答案:数据资产是指企业或组织所拥有的、具有经济价值的数据资源。它具有以下特征:可复制性(数据可以多次使用)、价值潜力(数据经过处理、分析可以创造经济价值)、流动性&…...
Docker化HBase排错实录:从Master hflush启动失败到Snappy算法未支持解决
前言 在容器化时代,使用 Docker 部署像 HBase 这样复杂的分布式系统也比较方便。社区也提供了许多方便的 HBase Docker 镜像,没有找到官方的 apache的,但有包含许多大数据工具的 harisekhon/hbase 或用于学习目的的 bigdatauniversity/hbase…...
端到端自动驾驶的数据规模化定律
25年4月来自Nvidia、多伦多大学、NYU和斯坦福大学的论文“Data Scaling Laws for End-to-End Autonomous Driving”。 自动驾驶汽车 (AV) 栈传统上依赖于分解方法,使用单独的模块处理感知、预测和规划。然而,这种设计在模块间通信期间会引入信息丢失&am…...
桌面端开发技术栈选型:开启高效开发之旅
在数字化浪潮中,桌面端应用依然占据重要地位,而选择合适的技术栈是打造优质桌面端应用的关键一步。以下是多种主流桌面端开发技术栈的介绍与对比,希望能为大家提供有价值的参考。 基于 Web 技术的跨平台框架 • Electron: • 特…...
C++模拟Java C#的 finally
在 Java 和 C# 中,finally 是一个与异常处理(try-catch)配合使用的关键字,用于确保一段代码无论是否发生异常都会被执行。它通常用于释放资源(如文件句柄、数据库连接、锁等),避免内存泄漏或状态…...
Spring Boot安装指南
🔖 Spring Boot安装指南 🌱 Spring Boot支持两种使用方式: 1️⃣ 可作为常规Java开发工具使用 2️⃣ 可作为命令行工具安装 ⚠️ 安装前提: 📌 系统需安装 Java SDK 17 或更高版本 🔍 建议先运行检查命令…...
zephyr架构下Bluetooth advertising接口
目录 概述 1 函数接口 2 主要函数介绍 2.1 bt_le_adv_start函数 2.1.1 函数功能介绍 2.1.2 典型使用示例 2.1.3 广播间隔 2.1.4 注意事项 2.2 bt_le_adv_stop 函数 2.2.1 函数功能 2.2.2 使用方法介绍 2.2.3 实际应用示例 2.2.4 关键注意事项 2.2.5 常见问题解决 …...
Oracle官宣 MySQL+APEX+AI三认证限时免费
1 MySQL8 OCP 考试代码 1Z0-908 免费时间:2025年4月20日至7月31日 https://education.oracle.com/mysql-promo 2 APEX云开发专家 考试代码 1Z0-771 免费时间:2025年5月15日截止! https://mylearn.oracle.com/ou/learning-path/become…...
深入理解N皇后问题:从DFS到对角线优化
N皇后问题是一个经典的算法问题,要求在NN的棋盘上放置N个皇后,使得它们互不攻击。本文将全面解析该问题的解法,特别聚焦于DFS算法和对角线优化的数学原理。 问题描述 在NN的国际象棋棋盘上放置N个皇后,要求: 任意两个…...