JWT认证服务
JSON Web Token(JWT)是一种用于在网络应用间安全地传递信息的紧凑、自包含的方式。以下是关于 JWT 认证服务器更详细的介绍,包括其意义、作用、工作原理、组成部分、时效性相关内容、搭建条件以及代码案例。
JWT 的意义与作用
- 意义:在分布式系统和前后端分离的架构中,JWT 提供了一种安全、便捷的身份验证和授权机制,使得不同的服务和应用之间能够可靠地识别用户身份和权限信息,同时保证信息的安全性和完整性。
- 作用
- 身份验证:用户登录后,服务器生成 JWT 并返回给客户端。客户端在后续请求中携带 JWT,服务器通过验证 JWT 来确定用户的身份,判断用户是否有权访问受保护的资源。
- 授权:JWT 中可以包含用户的角色、权限等信息,服务器根据这些信息来授权用户对不同资源的访问权限,实现细粒度的访问控制。
- 信息传递:可以在 JWT 中携带一些用户相关的信息,如用户名、用户 ID 等,这些信息可以在不同的服务之间传递,避免了多次查询数据库来获取用户信息,提高了系统的性能和效率。
JWT 的工作原理
- 用户登录:用户在客户端输入用户名和密码等登录信息,发送登录请求到服务器。
- 服务器验证:服务器接收到登录请求后,对用户提交的信息进行验证。如果验证通过,服务器根据用户信息生成 JWT。
- 生成 JWT:JWT 由三部分组成,分别是 Header(头部)、Payload(负载)和 Signature(签名)。服务器将用户的相关信息(如用户 ID、角色、权限等)放入 Payload 中,并使用密钥对 Header 和 Payload 进行签名,生成 Signature。然后将这三部分用点号(.)连接起来,形成一个完整的 JWT 字符串。
- 返回 JWT:服务器将生成的 JWT 作为响应返回给客户端。
- 客户端存储和使用:客户端收到 JWT 后,通常会将其存储在本地(如浏览器的 Local Storage 或 Session Storage 中)。在后续的请求中,客户端会在请求头的
Authorization
字段中携带 JWT,将其发送给服务器。 - 服务器验证:服务器接收到带有 JWT 的请求后,会从请求头中提取出 JWT,并使用与生成 JWT 时相同的密钥对其进行验证。验证过程包括验证 Signature 的有效性,以及检查 Payload 中的信息是否符合要求,如用户是否有权访问请求的资源、JWT 是否过期等。如果验证通过,服务器就会处理请求,并返回相应的结果;如果验证失败,服务器则返回错误信息,拒绝处理请求。
JWT 的组成部分
- Header(头部):通常包含两部分信息,一是声明类型,即
JWT
;二是使用的签名算法,如HS256
(HMAC with SHA-256)、RS256
(RSA with SHA-256)等。例如:
json
{"alg": "HS256","typ": "JWT"
}
- Payload(负载):包含了实际的用户信息和其他相关数据,也被称为声明(Claims)。这些声明可以是标准的声明,如
iss
(发行人)、exp
(过期时间)、sub
(主题)等,也可以是自定义的声明,用于存储用户的特定信息,如用户 ID、用户名、角色等。例如:
json
{"sub": "1234567890","name": "John Doe","admin": true,"exp": 1693200000
}
其中,exp
字段表示 JWT 的过期时间,是一个 Unix 时间戳,代表从 1970 年 1 月 1 日 00:00:00 UTC 到指定时间的秒数。通过这个字段,服务器可以验证 JWT 是否已经过期,从而判断用户的登录状态是否有效。
- Signature(签名):用于验证 JWT 的完整性和真实性。它是通过使用服务器端的密钥对 Header 和 Payload 进行签名生成的。签名的目的是确保 JWT 在传输过程中没有被篡改,并且只有拥有正确密钥的服务器才能生成有效的签名。签名的计算方式取决于在 Header 中指定的签名算法。例如,使用
HS256
算法时,签名的计算方式如下:
plaintext
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secretKey
)
其中,secretKey
是服务器端保存的密钥,只有服务器知道这个密钥。通过这个签名,服务器可以验证接收到的 JWT 是否是由自己生成的,并且在传输过程中没有被篡改。
JWT 的时效性
- 时效性的实现:如上述 Payload 中的
exp
字段所示,JWT 通过设置过期时间来控制其时效性。当服务器生成 JWT 时,会根据业务需求设置一个合理的过期时间,并将其放入exp
字段中。 - 时效性的验证:服务器在接收到 JWT 后,会首先检查
exp
字段的值。服务器将当前时间与exp
字段中的时间进行比较,如果当前时间超过了exp
字段中的时间,那么服务器就会认为 JWT 已经过期,拒绝处理该请求,并返回相应的错误信息。例如,在.NET 中,可以使用以下代码来验证 JWT 的时效性:
csharp
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;public class JwtTokenValidator
{public bool ValidateToken(string token, string secretKey){try{var tokenHandler = new JwtSecurityTokenHandler();var key = Encoding.ASCII.GetBytes(secretKey);tokenHandler.ValidateToken(token, new TokenValidationParameters{ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(key),ValidateIssuer = false,ValidateAudience = false,ClockSkew = TimeSpan.Zero // 不允许有时间偏移}, out SecurityToken validatedToken);var jwtToken = (JwtSecurityToken)validatedToken;// 检查令牌是否过期if (jwtToken.ValidTo < DateTime.UtcNow){return false;}return true;}catch{return false;}}
}
在上述代码中,ValidateToken
方法首先使用JwtSecurityTokenHandler
来验证 JWT 的签名和有效性,然后检查ValidTo
属性(对应于 JWT 中的exp
字段)是否大于当前的 UTC 时间。如果ValidTo
小于当前时间,说明 JWT 已经过期,返回false
;否则,返回true
。
搭建 JWT 认证服务器的条件
- 开发环境:需要安装相应的开发工具和框架,如在.NET 中,需要安装.NET SDK 和相关的 Web 开发框架(如ASP.NET Core);在前端 Vue3 项目中,需要安装 Node.js 和 Vue CLI 等。
- 密钥管理:服务器需要生成并安全地保存用于签名和验证 JWT 的密钥。这个密钥必须保密,不能泄露给客户端或其他未经授权的方。密钥的长度和强度应根据具体的安全需求来确定,一般来说,使用足够长度的随机字符串作为密钥可以提供较好的安全性。
- 身份验证逻辑:需要实现用户登录和身份验证的逻辑,包括与数据库或其他身份验证源进行交互,验证用户提供的用户名和密码等信息的正确性。在用户登录成功后,根据用户信息生成 JWT。
- 路由和中间件配置:在服务器端,需要配置路由来处理登录请求和受保护资源的请求。同时,需要使用中间件来验证 JWT,确保只有经过身份验证和授权的用户才能访问受保护的资源。在.NET 的ASP.NET Core 中,可以使用
JwtBearer
中间件来实现 JWT 的验证和授权功能。
代码案例
下面是一个简单的.NET + Vue3 的 JWT 认证服务器代码案例。
- .NET 后端(ASP.NET Core)
- 创建项目:使用
dotnet new webapi
命令创建一个新的ASP.NET Core Web API 项目。 - 安装依赖:安装
Microsoft.AspNetCore.Authentication.JwtBearer
和Microsoft.IdentityModel.Tokens
包,用于 JWT 的生成和验证。 - 配置 JWT 服务:在
Startup.cs
文件中,配置 JWT 服务和身份验证中间件。
- 创建项目:使用
csharp
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;public class Startup
{public IConfiguration Configuration { get; }public Startup(IConfiguration configuration){Configuration = configuration;}public void ConfigureServices(IServiceCollection services){// 配置JWT认证var secretKey = Configuration["Jwt:SecretKey"];var key = Encoding.ASCII.GetBytes(secretKey);services.AddAuthentication(x =>{x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(x =>{x.RequireHttpsMetadata = false;x.SaveToken = true;x.TokenValidationParameters = new TokenValidationParameters{ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(key),ValidateIssuer = false,ValidateAudience = false};});services.AddControllers();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseHttpsRedirection();app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}
}
- 创建登录接口:创建一个
AuthController
,用于处理用户登录请求并生成 JWT。
csharp
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{private readonly IConfiguration _configuration;public AuthController(IConfiguration configuration){_configuration = configuration;}[HttpPost("login")]public IActionResult Login([FromBody] UserCredentials credentials){// 这里可以与数据库或其他身份验证源进行交互,验证用户凭据if (credentials.Username == "admin" && credentials.Password == "123456"){// 创建Claimsvar claims = new[]{new Claim(ClaimTypes.Name, credentials.Username),new Claim(ClaimTypes.Role, "Admin")};// 获取JWT密钥var secretKey = _configuration["Jwt:SecretKey"];var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));// 创建JWT令牌var token = new JwtSecurityToken(issuer: null,audience: null,claims: claims,expires: DateTime.UtcNow.AddHours(1), // 设置过期时间为1小时signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256));var tokenHandler = new JwtSecurityTokenHandler();var jwtToken = tokenHandler.WriteToken(token);return Ok(new { Token = jwtToken });}return Unauthorized();}
}public class UserCredentials
{public string Username { get; set; }public string Password { get; set; }
}
- 创建受保护的接口:创建一个
ProtectedController
,用于测试 JWT 的身份验证和授权功能。
csharp
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;[Route("api/[controller]")]
[ApiController]
[Authorize] // 标记需要身份验证的控制器
public class ProtectedController : ControllerBase
{[HttpGet]public IActionResult GetProtectedData(){return Ok("This is protected data. Only authenticated users can access this.");}
}
- Vue3 前端
- 创建项目:使用
vue create vue3-jwt-auth
命令创建一个新的 Vue3 项目。 - 安装依赖:安装
axios
和vue-router
包,用于发送 HTTP 请求和路由管理。 - 配置登录逻辑:在
src/views/Login.vue
文件中,实现用户登录的界面和逻辑。
- 创建项目:使用
html
<template><div><h2>Login</h2><form @submit.prevent="login"><label for="username">Username:</label><input type="text" id="username" v-model="username" required><br><label for="password">Password:</label><input type="password" id="password" v-model="password" required><br><button type="submit">Login</button></form></div>
</template><script>
import axios from 'axios';
import { useRouter } from 'vue-router';export default {data() {return {username: '',password: ''};},methods: {async login() {const url = 'http://localhost:5000/api/Auth/login';const data = {username: this.username,password: this.password};try {const response = await axios.post(url, data);// 将JWT存储在本地存储中localStorage.setItem('jwt_token', response.data.Token);// 导航到受保护的页面this.$router.push('/protected');} catch (error) {console.error('Login failed:', error);}}}
};
</script>
- 配置路由和受保护页面:在
src/router/index.js
文件中,配置路由和受保护页面的访问权限。
javascript
import { createRouter, createWebHistory } from 'vue-router';
import Login from '../views/Login.vue';
import Protected from '../views/Protected.vue';const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes: [{path: '/',name: 'login',component: Login},{path: '/protected',name: 'protected',component: Protected,meta: {requiresAuth: true // 标记需要身份验证的路由}}]
});// 导航守卫,用于验证JWT
router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !localStorage.getItem('jwt_token')) {next('/');} else {next();}
});export default router;
- 创建受保护页面:在
src/views/Protected.vue
文件中,创建受保护的页面,用于测试 JWT 的身份验证功能。
html
<template><div><h2>Protected Page</h2><p>This is a protected page. Only authenticated users can access this.</p></div>
</template><script>
import axios from 'axios';export default {mounted() {const token = localStorage.getItem('jwt_token');if (token) {axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;// 这里可以发送请求获取受保护的数据axios.get('http://localhost:5000/api/Protected').then(response => console.log(response.data)).catch(error => console.error('Error:', error));}}
};
</script>
在上述代码案例中,.NET 后端实现了 JWT 的生成和验证功能,包括用户登录接口、身份验证中间件的配置以及受保护资源的接口。Vue3 前端实现了用户登录界面、JWT 的存储和在请求中携带 JWT 的功能,以及通过路由守卫来控制对受保护页面的访问。通过这个案例,可以看到 JWT 在前后端分离的应用中是如何实现身份验证和授权的。
工具网站
jwt.io 是一个与 JSON Web Token(JWT)相关的工具网站 ,网址为JSON Web Tokens - jwt.io 。其主要功能和特点如下:
功能
-
JWT 解码:能够对 JWT 进行解码,清晰展示 JWT 的三个组成部分,即 Header(头部)、Payload(负载)和 Signature(签名)。将 JWT 字符串粘贴到指定区域,网站会自动解析并以结构化形式呈现头部的算法和令牌类型、负载中的用户信息和声明等内容 ,方便开发者查看 JWT 内部信息,排查问题。例如,可直观看到 Payload 中存放的过期时间、用户 ID、角色等信息。
-
JWT 验证:支持验证 JWT 签名的有效性。开发者输入 JWT 以及对应的签名密钥和算法,网站会依据输入信息校验签名是否正确,判断 JWT 在传输过程中是否被篡改 。比如使用 HMAC SHA256 算法签名的 JWT,输入正确密钥后,网站就能验证其真实性。
-
JWT 生成:可辅助生成 JWT。在网站右侧的 “PAYLOAD” 部分,输入要包含在 JWT 中的信息(如用户 ID、角色、过期时间等,需为 Base64 编码的 JSON 格式 );在 “HEADER” 部分,选择签名算法(如 HMAC SHA256 或 RSA );在 “VERIFY SIGNATURE” 部分,输入签名密钥。完成设置后,网站左侧的 “ENCODED” 部分将展示生成的 JWT 及其头部和载荷信息 。
应用场景
-
开发调试阶段:开发者在开发涉及 JWT 认证和授权的应用程序时,可利用该网站快速验证 JWT 的结构、内容和签名的正确性,提高开发效率,减少调试时间。比如在前后端分离项目中,后端生成 JWT 后,前端可通过此网站验证接收到的 JWT 是否符合预期。
-
学习研究场景:对于学习 JWT 相关知识的人员,通过该网站可以更直观地理解 JWT 的组成结构、工作原理和签名验证机制等内容。例如,通过实际操作生成和解析 JWT,能更好地掌握 JWT 在身份验证和授权中的应用方式。
相关文章:
JWT认证服务
JSON Web Token(JWT)是一种用于在网络应用间安全地传递信息的紧凑、自包含的方式。以下是关于 JWT 认证服务器更详细的介绍,包括其意义、作用、工作原理、组成部分、时效性相关内容、搭建条件以及代码案例。 JWT 的意义与作用 意义…...
Raft算法
Raft算法用于保证分布式环境下多节点数据的一致性。 原理 Raft算法的主要思想是一个 选主(leader selection) 的算法思想,集群种每个节点都有可能成为三种角色。 三种角色 leader 对客户端通信的入口,对内数据同步的发起者,一个集群通常只…...
Kotlin 类委托深入解析:以 MMKV 为例看委托机制在 Android 中的巧妙应用
Kotlin 中的类委托(class delegation)是一个非常实用的特性,它允许我们将接口的实现交给另一个对象,从而简化代码,提升复用性和灵活性。本文将通过简单的 Demo 介绍类委托的基本用法,并以 Android 中的 MMK…...
2025年渗透测试面试题总结-某一线实验室实习扩展(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 某一线实验室实习扩展 一、流量分析深度实践 1. FTP反弹定时确认包流量检测 1.1 攻击原理与特征 1.…...
2025大唐杯仿真3——移动性管理
仅仅是1-2之间的信息交互...
云原生与微服务的关系
云原生(Cloud Native)和微服务(Microservices)是现代软件开发和部署中密切相关的两个概念,它们共同推动了应用程序的架构设计、开发模式和运维方式的变革。以下是两者的关系及核心要点: 定义与核心概念 云原…...
【百日精通JAVA | SQL篇 | 第三篇】 MYSQL增删改查
SQL得最核心就是增删改查 一个后端开发,在工作中,最常见的场景就是CRUD。 插入数据 insert into student values (1,zhangsan); 指定列插入数据 同时多个列明之间使用逗号,来分割 insert into student (name) values (zhaoliu); 这个黑框…...
【leetcode】记录与查找:哈希表的题型分析
前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…...
如何在 Windows 10 上安装 PyGame
PyGame 是 Python 编程语言中的一组跨平台模块,这意味着您可以在任何操作系统上安装它,这篇文章告诉您如何在 Windows 10 上安装 PyGame。 如何在 Windows 10 上安装 PyGame? PyGame 依赖于 Python,这意味着您必须在安装 PyGame …...
LVGL修改标签文本,GUI Guider的ui不生效
一.问题背景 笔者最近在学习LVGL框架,同时准备使用该框架作为课程设计的一部分,于是需要从静态显示进阶到动态显示以及事件交互。一方面由于笔者是初次接触LVGL,对它并不熟悉,另一方面由于其网络上的针对性具体资料太少&a…...
制造装备物联及生产管理ERP系统设计与实现(代码+数据库+LW)
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装制造装备物联及生产管理ERP系统软件来发挥其高效地信息处理…...
PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限
如果你用Mac管理照片,大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启,想合并照片得手动导出导入,重复文件更是无处可逃…… 直到我发现了 PowerPhotos,这款专为Mac设计的照片库管理…...
软件工程面试题(三十)
将ISO8859-1字符串转成GB2312编码,语句为? String snew String(text.getBytes(“iso8859-1”),”gb2312”). 说出你用过的J2EE标准的WEB框架和他们之间的比较? 答:用过的J2EE标准主要有:JSP&Servlet、JDBC、JNDI…...
Java面试黄金宝典35
1. A 和 B 两个表做等值连接 (Inner join) 怎么优化 索引优化:在连接字段上创建索引,让数据库在进行等值连接时,能够快速定位匹配的记录,减少全表扫描的开销。例如,若 A 表和 B 表通过 id 字段进行连接,可在…...
openssl-1.0.1e.tar.gz编译安装步骤
下载与验证 openssl-1.0.1e.tar.gz下载链接:https://pan.quark.cn/s/d682551565e8 校验文件完整性(示例): # 检查 SHA256 哈希值 sha256sum openssl-1.0.1e.tar.gz # 对比官方发布的哈希值(需从 OpenSSL 官网获取&a…...
供应链业务-供应链全局观(二)
概述 我们在供应链业务知识分享的第一篇供应链业务-供应链全局观(一)中大致聊了以下三点: 1、供应链的本质:环环相扣的增值网络。供应链是从供应商的供应商到客户的客户之间,通过采购、生产、运输、仓储、销售等环节…...
在 Flutter 中Navigator.push 用于实现页面之间的导航
在 Flutter 中,Navigator.push 是一个非常重要的方法,用于实现页面之间的导航。通过 Navigator.push,你可以将一个新的页面(路由)推送到导航栈中,从而显示新的内容。 以下是一个详细的教程,帮助…...
安永启用AI驱动SAP云ERP系统
安永(EY)宣布与 SAP 和微软展开战略合作,正式启动将其内部业务系统升级为基于 SAP S/4HANA Cloud 私有版的现代化 ERP 系统,并部署在 Microsoft Azure 云平台上。此次转型不仅涉及系统更新,还将通过引入人工智能&#…...
Augment Code:下一代AI编程助手,能否超越GitHub Copilot?
1. 背景介绍 近日,AI编程助手公司 Augment Code 宣布完成 2.27亿美元B轮融资,估值接近 9.77亿美元,距离独角兽企业仅一步之遥。本轮融资由 Sutter Hill Ventures、Index Ventures、Innovation Endeavors、Lightspeed Venture Partners 和 Me…...
图像处理之《直方图规定化和低失真数据隐藏的可逆对比度增强》论文阅读
全文目录 一、文章摘要二、直方图规定化三、提出的方法A.峰值和零点的选择B.数据序列扩展C. V L D E \mathrm{VLD_E} VLDE: 带有扩展的极低失真D.提出的RCE-HS方案四、实现细节五、汇报PPT一、文章摘要 本文研究可逆对比度增强(RCE)。图像增强是通过直方图规定化实现的,直方…...
状态模式~
状态模式 在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同状态下也将具有不同的行为. 状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式就是用于解决系统…...
Latex入门之超详细的Latex环境配置教程
最近在学习Latex,顺便给大家分享一下Latex环境配置的心得。Latex作为一种高质量的排版系统,广泛应用于学术论文、书籍和报告的排版中。对于初学者来说,配置Latex环境可能是个挑战,但只要按照本文的步骤来,其实并不难。…...
[WUSTCTF2020]CV Maker1
进来是个华丽的界面,我们先跟随这个网页创造一个用户 发现了一个上传端口,尝试上传一个php文件并抓包 直接上传进不去,加个GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 传入 并且报告了 上传路径,然后使用蚁剑连接...
第1课:React开发环境搭建与第一个组件
第1课:React开发环境搭建与第一个组件 学习目标 搭建React开发环境创建第一个React项目了解项目基本结构编写并运行第一个React组件 一、环境准备 1. 安装Node.js React开发需要Node.js环境,它包含了npm(Node Package Manager࿰…...
go垃圾回收机制
Go语言的垃圾回收(GC)机制旨在高效管理内存,同时最小化对程序性能的影响。其核心设计结合了并发标记清除、三色标记法和写屏障技术,显著减少了停顿时间(Stop-The-World, STW)。以下是Go垃圾回收机制的关键特…...
【GPT入门】第 34 课:深度剖析 ReAct Agent 工作原理及代码实现
【GPT入门】第 34 课:深度剖析 ReAct Agent 工作原理及代码实现 1. React Agent概述2. React Agent工作原理、关键特点、应用场景3. langchain的ReAct Agent代码实现3.1 Openai1.x 代码实现3.2 Openai 0.x的实现3.3 新旧版API异同比较 1. React Agent概述 定义与基…...
MySQL介绍及使用
1. 安装、启动、配置 MySQL 1. 安装 MySQL 更新软件包索引 sudo apt update 安装 MySQL 服务器 sudo apt install mysql-server 安装过程中可能会提示你设置 root 用户密码。如果没有提示,可以跳过,后续可以手动设置。 2. 配置 MySQL 运行安全脚本…...
九、重学C++—类和函数
上一章节: 八、重学C—动态多态(运行期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147004745?spm1001.2014.3001.5502 本章节代码: cpp/cppClassAndFunc.cpp CuiQingCheng/cppstudy - 码云 - 开源中国…...
C++·包装器
目录 function 包装各种可调用对象 包装类成员函数 应用举例 bind 一般形式 arg_list 调整参数顺序 调整参数个数(绑死) 应用举例 小知识 function 包含在<functional>头文件中,是一个类模版,但本质还是仿函数。…...
Linux动态监控进程利器:top命令详解
动态监控进程利器:top命令详解 在Linux系统的日常管理中,实时监控进程状态和资源使用情况是一项至关重要的任务。top命令作为Linux系统自带的强大工具,以其动态更新的特性,成为了系统管理员和开发者的得力助手。本文将全面解析to…...
家庭路由器wifi设置LAN2LAN和LAN2WAN
一、LAN2LAN 方式:桥接模式,主路由器的LAN口接入子路由器的LAN口 子路由器先重置登录密码(知道密码可以不重置),登录后台 1、设置为动态IP模式 2、找到LAN口设置 1)ip设置和主路由器在一个网段上&#…...
Python实现NOA星雀优化算法优化LightGBM分类模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 在机器学习领域,分类问题是许多实际应用场景的核心任务之一,例如信用评估、…...
面试顺序优化:基于Matlab的高效决策方案
内容摘要 本文围绕面试顺序问题,通过建立数学模型并利用Matlab编程求解,寻找使面试总时长最短的面试顺序安排。详细介绍问题分析、模型构建及Matlab代码实现过程,为类似的时间优化问题提供参考,助力提升流程效率。 关键词&#x…...
【暑期实习之战】2024年美团秋招技术岗第一批笔试(练习)
选择题 6. 在MySQL中可以用来执行预处理语句的是() A execute B prepare C deallocate D using prepare:用于预编译SQL语句(为执行做准备),但并非执行动作本身。execute:专门用于执行已通过 PREPARE 预处理的语句,是运行预编译查询的关键步骤。✔deallocate prepare:…...
VLAN详解
VLAN(虚拟局域网)详解 1. 基本概念 VLAN(Virtual Local Area Network)是一种通过逻辑划分而非物理连接实现的局域网技术,允许在同一物理网络基础设施上创建多个独立的广播域。 2. 核心功能 功能说明广播域隔离不同V…...
[leetcode]1786. 从第一个节点出发到最后一个节点的受限路径数(Dijkstra+记忆化搜索/dp)
题目链接 题意 给定一个无向连通图,edges{u,v,w} 表示 u u u和 v v v之间有一条无向边,边权为 w w w n n n个点 [ 1 , n ] [1,n] [1,n] 每个点到 n n n的最短路为 d i s [ i ] dis[i] dis[i] 定义受限路径: 从起点 1 1 1到 n n n,路径上的…...
Ubuntu挂载HDD迁移存储PostgreSQL数据
关联博客:windows通用网线连接ubuntu实现ssh登录、桌面控制、文件共享 背景: 在个人ubuntu机器上安装了pgsql,新建了一张表插入了2000w数据用于模拟大批量数据分页查询用,但是发现查询也不慢(在公司测试环境查询1700…...
设计模式简述(五)建造者模式
建造者模式 描述基本要素协调类使用 描述 建造者模式属于创造型设计模式。 通常用于构建一系列复杂对象,这些对象有一定的共性。 我们可以通过不同的建造者,组装不同的对象 与工厂模式的区别,建造者模式更侧重与基于基础构件组装而非直接创…...
ARXML文件解析-2
目录 1 摘要2 常见ARXML文件注意事项以及常见问题2.1 注意事项2.2 常见问题2.3 答疑 3 ARXML解读/编辑指南3.1 解读ARXML文件的步骤3.2 编辑ARXML文件的方法3.3 验证与调试 4 总结 1 摘要 本文主要对ARXML文件的注意事项、常见问题以及解读与编辑进行详细介绍。 上文回顾&…...
Docker设置代理
目录 前言创建代理文件重载守护进程并重启Docker检查代理验证 前言 拉取flowable/flowable-ui失败,用DaoCloud源也没拉下来,不知道是不是没同步。索性想用代理拉镜像。在此记录一下。 创建代理文件 创建docker代理配置 sudo mkdir -p /etc/systemd/s…...
ASP.NET Core Web API 参数传递方式
文章目录 前言一、参数传递方式路由参数(Route Parameters)查询字符串参数(Query String Parameters)请求体参数(Request Body)表单数据(Form Data)请求头参数(Header Pa…...
火语言RPA--PgSQL-导入数据表格
【组件功能】:导入特定的表格数据到包含同样字段的数据表 将表格对象数据通过数据库操作对象导入到指定数据库。 配置预览 配置说明 源表格 表格来源有“来自表格对象”和“来自表达式”2种,表达式支持DataTable类型变量。 对象 对应来自表格对象&…...
Spring Cloud 网关及配置管理教学
一、课程目标 深入理解 Spring Cloud 中网关和配置管理的核心概念、原理及应用场景。熟练掌握 Spring Cloud Gateway 的配置与开发,能够实现请求路由、登录校验、用户信息传递等功能。学会使用 Nacos 进行配置管理,包括共享配置、配置热更新和动态路由的…...
202520 | 微服务
微服务 VS 单体架构 单体架构(Monolithic Architecture)和微服务架构(Microservices Architecture)是两种主流的软件设计模式,它们在开发、部署、扩展和维护等方面有显著差异。以下是两者的详细对比: 1. 定…...
32信号和槽_信号和槽存在的意义(2)
① 一个学生,可以选择多门课程来学习 一门课程,也可以被多个同学来选择 ② 张三这个同学,可以选 语文和数学 . 李四这个同学可以选 语文 和 英语 语文这门课程,既可以被张三选择,也可以被李四选择~~ ③ 引入第三张表作为关联表 ④一个信号,可以 connect 到多个槽函数上 一个槽…...
Mac 上使用 mysql -u root -p 命令,出现“zsh: command not found: mysql“?
一、确定 MySQL 安装路径: 如果你是使用 Homebrew 安装的 MySQL,通常安装路径是 /usr/local/mysql/bin 。 如果你是通过官方 DMG 安装包安装的 MySQL,默认安装路径可能是 /usr/local/mysql/bin 。你可以在终端中使用以下命令来查找 MySQL 的…...
Django REST Framework系列教程(9)——过滤与排序
目录 前情回顾 方法一: 重写get_queryset方法 方法二: 使用django-filter 安装django-filter 自定义FilterSet类 方法三: 使用SearchFilter类 自定义SearchFilter类 排序OrderingFilter类 在前面的DRF系列教程中,我们以博客为例介绍了序列化器(Serializer),…...
工业级主题系统程序设计
一、架构优化方案 #mermaid-svg-gB72o6CBc2UMgkrv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gB72o6CBc2UMgkrv .error-icon{fill:#552222;}#mermaid-svg-gB72o6CBc2UMgkrv .error-text{fill:#552222;stroke:#5…...
Java 逐梦力扣之旅_[204. 计数质数]
题目: 204. 计数质数 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出&…...
[3.3] 阻塞与非阻塞通信 理论+代码
文章目录 1. 阻塞通信的发生和解决2. 点对点通信应用程序案例 - 随机步行(Random Walk) 1. 阻塞通信的发生和解决 MPI的p2p中包括两种模式: a. 阻塞通信(Blocking) MPI_Send 和 MPI_Recv 在返回前,必须满…...