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

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

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用
✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
🌞《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

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

  • 1. 前言
  • 2. Remember-Me 机制概述
  • 3. 基于 Token 的 Remember-Me 机制
    • 开始配置 Token 方案
  • 4. 持久化令牌方案
    • ❶ 持久化令牌方案的工作流程
    • ❷ 数据库表设计 + sprigboot配置
    • ❸ Spring Security 配置
  • 5. 持久化令牌方案的安全增强实现
    • 令牌生成策略优化
    • 令牌验证逻辑强化
    • 自动清理过期令牌
    • 实时吊销机制
    • 多维度安全防护
    • 最佳实践
  • 结语

回顾链接:
最新Spring Security实战教程(一)初识Spring Security安全框架
最新Spring Security实战教程(二)表单登录定制到处理逻辑的深度改造
最新Spring Security实战教程(三)Spring Security 的底层原理解析
最新Spring Security实战教程(四)基于内存的用户认证
最新Spring Security实战教程(五)基于数据库的动态用户认证传统RBAC角色模型实战开发
最新Spring Security实战教程(六)最新Spring Security实战教程(六)基于数据库的ABAC属性权限模型实战开发
最新Spring Security实战教程(七)方法级安全控制@PreAuthorize注解的灵活运用

专栏更新完毕后,博主将会上传所有章节代码到CSDN资源免费给大家下载,如你不想等后续章节代码需提前获取,可以私信或留言!

1. 前言

在我们日常开发中登陆后台,“Remember-Me”(记住我)功能是一种常见的安全增强机制,允许用户在关闭浏览器后仍然保持登录状态,而无需重新输入用户名和密码。Spring Security 提供了多种 Remember-Me 方案,最常用的是基于哈希的Token方案持久化令牌方案

本章节博主将详细讲解这两种方案的实现,带大家快速入门!在小伙伴们实际开发中可进行各自需求的改造!


2. Remember-Me 机制概述

Spring Security 中,Remember-Me 的核心作用是在会话失效后依然允许用户自动登录。其基本工作流程(以更常用的持久化令牌方案为例)如下:
在这里插入图片描述

  • 用户登录成功后,如果勾选了“记住我”,服务器会创建一个 Remember-Me Token,并存储在客户端的 Cookie
  • 当用户的会话失效后,系统会检查 Cookie 是否存在并有效:
    1、如果有效,则自动完成登录;
    2、如果无效或过期,则用户需要重新认证。

Spring Security 主要提供两种 Remember-Me 方案:

基于 Token(默认方案):在 Cookie 中存储加密 Token默认使用 TokenBasedRememberMeServices

持久化令牌方案(更安全):将 Token 存储在数据库中,并在每次 Remember-Me 认证时进行更新(使用 PersistentTokenBasedRememberMeServices


3. 基于 Token 的 Remember-Me 机制

Spring Security 默认提供 TokenBasedRememberMeServices,其基本原理如下:

  • 当用户登录时,系统生成一个 Token,并将其存储在 Cookie 中:
Base64(username + ":" + expirationTime + ":" + MD5(username + ":" + expirationTime + ":" + password + ":" + key))
  • 后续每次请求时,系统从 Cookie 读取 Token,并验证其正确性:
  • 检查 Token 是否未过期;
  • 重新计算 MD5 哈希值,并与 Token 中的值进行对比;
  • 验证通过后自动完成登录。

开始配置 Token 方案

为了快速演示这里我们就用我们第三章节中基于内存的用户认证的模块代码来追加演示,复用 maven项目中 memory-spring-security 子模块代码,新建一个 remember-spring-security 子模块
如小伙伴没了解基于内存的用户认证的相关知识可以访问 最新Spring Security实战教程(三)Spring Security 的底层原理解析 进行学习!

配置 Spring Security

@Configuration
public class RememberSecurityConfig {// 手动配置用户信息@Beanpublic UserDetailsService users() {UserDetails user = User.withUsername("user").password("{noop}user") // {noop}表示不加密.roles("USER").build();UserDetails admin = User.withUsername("admin").password("{noop}admin") // {noop}表示不加密
//                .password(passwordEncoder().encode("admin")).roles("ADMIN").build();UserDetails anonymous = User.withUsername("anonymous").password("{noop}anonymous").roles("ANONYMOUS").build();return new InMemoryUserDetailsManager(user, admin, anonymous);}// 配置安全策略@BeanSecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated()).formLogin(withDefaults()).logout(withDefaults()).rememberMe(rememberMe -> rememberMe.key("mySecretKey") // 服务器端密钥.tokenValiditySeconds(7 * 24 * 60 * 60) // 7天有效期.userDetailsService(users())) // 认证用户信息;return http.build();}}

代码解析
rememberMe.key(“mySecretKey”) :服务器端密钥,防止 Token 被伪造。
tokenValiditySeconds(7 * 24 * 60 * 60) :Token 7 天有效。
userDetailsService(users()) :Remember-Me 认证时使用的 UserDetailsService。

配置 测试controller

@Controller
public class DemoRememberController {@GetMapping("/")public ResponseEntity<Map<String, Object>> index(Authentication authentication) {String username = authentication.getName();//用户名Object principal =authentication.getPrincipal();//身份// 获取用户拥有的权限列表List<String> roles = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());//返回用户信息return ResponseEntity.ok(Map.of("username", username,"principal", principal,"roles", roles));}@GetMapping("/admin/view")public ResponseEntity<String> admin() {return ResponseEntity.ok("管理员ADMIN角色访问ok");}
}

访问 /login 并输入管理员用户名/密码(admin),勾选 “Remember-Me” 选项。
登录成功后,查看浏览器 Cookie:
在这里插入图片描述
关闭浏览器后重新访问 /admin/view,系统会自动完成认证,无需重新输入用户名/密码。

安全提示:

使用Base64简单加密,令牌无状态、易预测
由于 Token 直接存储在 Cookie 中,一旦被盗,攻击者可直接伪造登录
仅适用于低安全性要求的系统,不推荐在金融、政府、企业级应用中使用


4. 持久化令牌方案

持久化令牌方案相比 Token 方案更安全:

  • Token 存储在数据库,而非 Cookie,避免被轻易伪造。
  • 每次 Remember-Me 认证时,生成新的 Token 并存入数据库,防止 Token 重放攻击。

❶ 持久化令牌方案的工作流程

  1. 用户登录后,系统生成一个 seriesId 和 tokenValue,并存储到数据库;
  2. 服务器将 seriesId 存入 Cookie,tokenValue 仅存储在数据库;
  3. 下次用户访问时:

服务器从 Cookie 获取 seriesId;
从数据库查找对应的 tokenValue;
验证成功后,生成新的 tokenValue 并更新数据库(防止 Token 被重放攻击)

❷ 数据库表设计 + sprigboot配置

CREATE TABLE persistent_logins (username VARCHAR(64) NOT NULL,series VARCHAR(64) PRIMARY KEY,token VARCHAR(64) NOT NULL,last_used TIMESTAMP NOT NULL
);

因为涉及使用数据源,这里 pom 文件配置博主就复用之前章节的配置内容:

    <dependencies><!--使用 HikariCP 连接池--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.9</version></dependency><!-- jdk 11+ 引入可选模块 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-jsqlparser</artifactId><version>3.5.9</version></dependency></dependencies>

yml 配置文件,只需要追加datasource数据源配置即可

server:port: 8086spring:application:name: remember-db-spring-security #最新Spring Security实战教程(八)Remember-Me实现原理 - 持久化令牌与安全存储方案datasource:url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTCusername: rootpassword: toher888driver-class-name: com.mysql.cj.jdbc.Driverhikari:maximum-pool-size: 5

❸ Spring Security 配置

这里博主就不演示从数据库获取用户信息认证了,这里就使用手动配置用户信息。
需要了解的小伙伴可以访问 最新Spring Security实战教程(五)基于数据库的动态用户认证传统RBAC角色模型实战开发 进行学习了解

注入数据源,添加 PersistentTokenRepository

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {//注入数据源private final DataSource dataSource;// 手动配置用户信息@Beanpublic UserDetailsService users() {UserDetails user = User.withUsername("user").password("{noop}user") // {noop}表示不加密.roles("USER").build();UserDetails admin = User.withUsername("admin").password("{noop}admin") // {noop}表示不加密
//                .password(passwordEncoder().encode("admin")).roles("ADMIN").build();UserDetails anonymous = User.withUsername("anonymous").password("{noop}anonymous").roles("ANONYMOUS").build();return new InMemoryUserDetailsManager(user, admin, anonymous);}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/admin").hasRole("ADMIN").anyRequest().authenticated()).formLogin(withDefaults()).rememberMe(rememberMe -> rememberMe.key("myPersistentKey").tokenRepository(persistentTokenRepository()) // 采用数据库存储.tokenValiditySeconds(14 * 24 * 60 * 60) // 14 天有效期.userDetailsService(userDetailsService()));return http.build();}@Beanpublic PersistentTokenRepository persistentTokenRepository() {JdbcTokenRepositoryImpl repo = new JdbcTokenRepositoryImpl();repo.setDataSource(dataSource);return repo;}
}

1、tokenRepository(persistentTokenRepository()):使用数据库存储 Token;
2、JdbcTokenRepositoryImpl:Spring 提供的默认数据库 Token 存储实现;
3、tokenValiditySeconds(14 * 24 * 60 * 60):Token 有效期设定为 14 天。

启动运行测试进行登陆,会发现数据库中多了一条Token数据,同时关闭浏览器重新访问 /admin/view,系统会自动完成认证,无需重新输入用户名/密码。

在这里插入图片描述

5. 持久化令牌方案的安全增强实现

上述讲解中使用官方默认的配置其实已经能满足我们大部分需求,但是我们也会遇到需要自定义令牌生成、验证,这里博主就简单编写两个供大家参考

令牌生成策略优化

public class CustomPersistentTokenRepository extends JdbcTokenRepositoryImpl {@Overridepublic void createNewToken(PersistentRememberMeToken token) {String encryptedToken = BCrypt.hashpw(token.getTokenValue(), BCrypt.gensalt());super.createNewToken(new PersistentRememberMeToken(token.getUsername(),token.getSeries(),encryptedToken,token.getDate()));}
}

令牌验证逻辑强化

@Component
public class TokenValidationService {public boolean validateToken(PersistentRememberMeToken token, String presentedToken) {return BCrypt.checkpw(presentedToken, token.getTokenValue());}
}

自动清理过期令牌

使用定时器定期清理过期的令牌

@Scheduled(fixedRate = 24 * 60 * 60 * 1000) // 每日清理
public void purgeExpiredTokens() {jdbcTemplate.update("DELETE FROM persistent_logins WHERE last_used < ?",Date.from(Instant.now().minus(60, ChronoUnit.DAYS)));
}

实时吊销机制

@PostMapping("/revoke-remember-me")
public void revokeTokens(@AuthenticationPrincipal User user) {tokenRepository.removeUserTokens(user.getUsername());
}

多维度安全防护

攻击类型防护措施实现方法
令牌窃取令牌绑定IP+UAPersistentToken中存储用户特征,验证时比对
暴力破解增加BCrypt计算成本BCrypt.hashpw(token, BCrypt.gensalt(12))
重放攻击单次使用令牌每次验证后更新令牌
CSRF启用SameSite Cookie.rememberMe().cookie().samesite(SameSite.STRICT)

最佳实践

生产环境建议使用 持久化令牌方案,避免 Token 被伪造。
Token 存储应使用 加密存储(如 BCrypt)。
对 persistent_logins 表定期清理,避免 Token 长期滞留。


结语

至此我们就完成了 Spring Security Remember-Me 机制 的深入解析,包含 Token方案持久化令牌方案 的完整实现及源码讲解。

如果本本章内容对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


下一章:最新Spring Security实战教程(九)前后端分离认证实战 - JWT+SpringSecurity无缝整合

在这里插入图片描述

相关文章:

最新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; …...

前端开发时的内存泄漏问题

目录 &#x1f50d; 什么是内存泄漏&#xff08;Memory Leak&#xff09;&#xff1f;&#x1f6a8; 常见的内存泄漏场景1️⃣ 未清除的定时器&#xff08;setInterval / setTimeout&#xff09;2️⃣ 全局变量&#xff08;变量未正确释放&#xff09;3️⃣ 事件监听未清除4️⃣…...

「青牛科技 」GC4931P/4938/4939 12-24V三相有感电机驱动芯片 对标Allegro A4931/瑞盟MS4931

芯片描述&#xff1a; • 芯片工作电压 4.7-36V &#xff08; GC4931P &#xff09; • 芯片工作电压 7.5-36V &#xff08; GC4938/4939 &#xff09; • 外置 mos 驱动&#xff0c; NN 结构&#xff0c;内置升压预驱 • QFN5X5-28 封装&#xff0c;带 ePAD 散热&#…...

2025 年山东危化品经营单位考试攻略分享​

山东的考试在全省统一标准。理论考试深入考查危化品相关标准规范&#xff0c;如《危险化学品重大危险源辨识》等。对于危化品储存设施的设计与维护知识要求较高。实际操作考核注重在山东化工园区常见的作业场景&#xff0c;如大型储罐区的操作。​ 报名准备材料与其他省份类似…...

RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程

在需要控制和被控制的电脑上安装软件 github开源仓库地址 https://github.com/rustdesk/rustdesk/releases 蓝奏云盘备份 ( exe ) https://geek7.lanzouw.com/iPf592sadqrc 密码:4esi 中继服务器设置 使用docker安装 sudo docker image pull rustdesk/rustdesk-server sudo…...

CMake 中的置变量

在 CMake 中&#xff0c;变量是存储和传递信息的重要方式。以下是一些常用的 CMake 变量&#xff0c;以表格形式列出&#xff0c;包括它们的名称、含义和常见用途&#xff1a; 变量名称含义常见用途CMAKE_CURRENT_SOURCE_DIR当前处理的 CMakeLists.txt 文件所在的源代码目录的…...

前后端数据序列化:从数组到字符串的旅程(附优化指南)

&#x1f310; 前后端数据序列化&#xff1a;从数组到字符串的旅程&#xff08;附优化指南&#xff09; &#x1f4dc; 背景&#xff1a;为何需要序列化&#xff1f; 在前后端分离架构中&#xff0c;复杂数据类型&#xff08;如数组、对象&#xff09;的传输常需序列化为字符…...

为什么你涨不了粉?赚不到技术圈的钱?

“你的代码如果能打造市值百亿的产品&#xff0c;为什么不能为你的未来加冕&#xff1f;” 这不仅是一句口号&#xff0c;而是一段激励人心的故事的起点。想象一下&#xff0c;一个普通的程序员&#xff0c;在无数个深夜独自敲击代码中&#xff0c;他的每一行代码都承载着对未…...

MATLAB之数据分析图系列 三

三维堆叠柱状图 Bar3StackPlot.m文件 clc; clear; close all; %三维堆叠柱状图 %% 数据准备 % 读取数据 load data.mat % 初始化 dataset X; s 0.4; % 柱子宽度 n size(dataset,3); % 堆叠组数%% 图片尺寸设置&#xff08;单位&#xff1a;厘米&#xff09; figureUnits c…...

【nvidia】Windows 双 A6000 显卡双显示器驱动更新问题修复

问题描述&#xff1a;windows自动更新nvidia驱动会导致只检测得到一个A6000显卡。 解决方法 下载 A6000 驱动 572.83-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.exehttps://download.csdn.net/download/qq_18846849/90554276 不要直接安装。如…...

使用Docker快速部署Dify

使用Docker快速部署Dify:一站式AI应用开发平台 Dify 是一款开源的AI应用开发平台,支持快速构建基于大模型的AI应用。通过Docker部署Dify,可以简化环境配置流程,实现高效部署和扩展。本教程将详细介绍如何通过Docker快速部署Dify。 前置条件 ​服务器/本地环境:Linux/Wind…...

Uniapp 实现微信小程序滑动面板功能详解

文章目录 前言一、功能概述二、实现思路三、代码实现总结 前言 Uniapp 实现微信小程序滑动面板功能详解 一、功能概述 滑动面板是移动端常见的交互组件&#xff0c;通常用于在页面底部展开内容面板。本文将介绍如何使用 Uniapp 开发一个支持手势滑动的底部面板组件&#xff0…...

PyQt5和OpenCV车牌识别系统

有需要请加文章底部Q哦 可远程调试 PyQt5和OpenCV车牌识别系统 一 介绍 此车牌识别系统基于PyQt5和OpenCV开发&#xff0c;蓝牌&#xff0c;新能源(绿牌)&#xff0c;黄牌&#xff0c;白牌均可以准确识别&#xff0c;支持中文识别&#xff0c;可以导出识别结果(Excel格式)。此…...

Redis如何在windows中简单安装?

Redis 在官网上有详细的介绍如何安装&#xff0c;但是看着也乱和麻烦。所以教大家直接用大佬整理好的。 Redis安装 ✨进入安装包地址✨安装Redis✨测试下 ✨进入安装包地址 安装包地址&#xff1a; https://github.com/tporadowski/redis/releases Redis安装包是在github上&am…...

在centos7上安装ragflow

在centos7上安装ragflow 前置条件&#xff0c;安装centos7&#xff0c;换yum源&#xff0c;安装docker&#xff0c;安装git 参考文章&#xff1a;利用vmware快速安装一个可以使用的centos7系统-CSDN博客 ragflow的部署参考文章&#xff1a; https://mp.weixin.qq.com/s/Hor…...

LabVIEW多线程

在 LabVIEW 中&#xff0c;多线程编程是提升程序执行效率的关键手段&#xff0c;尤其是在需要并行处理数据采集、控制执行和用户界面交互的场景下。LabVIEW 本身是基于数据流&#xff08;Dataflow&#xff09;的编程语言&#xff0c;天然支持多线程&#xff0c;但要高效利用多线…...

MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist

mysqldump -uroot -p ca>ca.sql Enter password: mysqldump: Couldnt execute SHOW VARIABLES LIKE gtid\_mode: Table performance_schema.session_variables doesnt exist 解决&#xff1a; USE performance_schema; CREATE TABLE session_variables (VARIABLE_NAME VAR…...

4月2号.

正则表达式的作用: 作用一: 示例: [1-9]表示0不在开头,\\d表示数字,{5,19}表示位数. 拓展: 正则表达式: System.out.println("a".matches(regex:"[a-z&[def]]")); //trueSystem.out.println("&".matches(regex:"[a-z&[def]]&…...

分析sys高问题的方法总结

一、背景 sys高的问题往往属于底层同学更需要关注的问题&#xff0c;sys高的问题往往表现为几种情况&#xff0c;一种是瞬间的彪高&#xff0c;一种是持续的彪高。这篇博客里&#xff0c;我们总结一下常用的分析方法和分析工具的使用来排查这类sys高的问题。 二、通过mpstat配…...

使用Leaflet对的SpringBoot天地图路径规划可视化实践-以黄花机场到橘子洲景区为例

目录 前言 一、路径规划需求 1、需求背景 2、技术选型 3、功能简述 二、Leaflet前端可视化 1、内容布局 2、路线展示 3、转折路线展示 三、总结 前言 在当今数字化与智能化快速发展的时代&#xff0c;路径规划技术已经成为现代交通管理、旅游服务以及城市规划等领域的…...

操作系统(中断 异常 陷阱) ─── linux第28课

目录 1.硬件中断 2. 时钟中断 3. OS本质 4. 软件中断 缺页中断&#xff1f;内存碎片处理&#xff1f;除零野指针错误&#xff1f; 操作系统本质总结 操作系统是对软件硬件资源管理的软件 1.硬件中断 中断向量表(IDT)就是操作系统的⼀部分&#xff0c;启动就加载到内存中了…...

数据接口以及ORM查询

一&#xff0c;Model数据关系&#xff1a; &#xff08;1&#xff09;种类&#xff1a; 一对一关系&#xff08;例如身份证和钥匙&#xff0c;账号密码等&#xff0c;各自一一对应。&#xff09;&#xff0c;一对多关系 &#xff08;例如一个作者可以有很多作品&#xff0c;…...

clickhouse集群版本部署文档

集群版本介绍 clickhouse是表级别的集群&#xff0c;一个clickhouse实例可以有分布式表&#xff0c;也可以有本地表。本文介绍4个节点的clickhouse情况下部署配置。 分布式表数据分成2个分片&#xff0c;2个副本&#xff0c;总共4份数据&#xff1a; 节点1数据&#xff1a;分…...

《全栈+双客户端Turnkey方案》架构设计图

今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1&#xff1a;三种分布式部署方案:网关方案&#xff0c;超级服务器单服方案&#xff0c;直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…...

2025年2月一区SCI-壮丽细尾鹩莺算法Superb Fairy-wren Optimization-附Matlab免费代码

引言 本期介绍一种新的元启发式算法——壮丽细尾鹩莺优化算法Superb Fairy-wren Optimization algorithm&#xff0c;SFOA。该算法结合了壮丽细尾鹩莺群体中幼鸟的发育&#xff0c;繁殖后喂养幼鸟的行为&#xff0c;以及它们躲避捕食者的策略&#xff0c;于2025年2月最新发表在…...

Mac下小智AI本地环境部署

可以进行聊天、编写程序、播放歌曲等等的小智语音聊天小助手&#xff0c;在Mac环境下修改源代码&#xff0c;值得拥有。本篇内容主要讲解Mac下环境的搭建&#xff0c;WebSocket的修改。注&#xff1a;环境python3.12.0、ESP-IDF5.4.0、开发板ESP32S3。 目录 1.Git安装2.Python…...

小程序30-wxml语法-声明和绑定数据

小程序页面中使用的数据均需要在Page() 方法的 data对象中进行声明定义 在将数据声明好以后&#xff0c;在 WXML 使用 Mustache 语法 ( 双大括号{{ }} ) 将变量包起来&#xff0c;从而将数据绑定 在 {{ }} 内部可以做一些简单的运算&#xff0c;支持如下几种方式: 算数运算三…...