SpringBoot状态机
Spring Boot 状态机(State Machine)是 Spring Framework 提供的一种用于实现复杂业务逻辑的状态管理工具。它基于有限状态机(Finite State Machine, FSM)的概念,允许开发者定义一组状态、事件以及它们之间的转换规则。这在处理具有多个步骤或条件的工作流时特别有用。
Spring StateMachine 组件
Spring StateMachine 是一个专门设计来帮助构建和管理状态机的库。它提供了丰富的功能来简化状态机的配置和使用。以下是几个关键概念:
- 状态(States):表示系统可以处于的不同状况。
- 事件(Events):触发从一个状态到另一个状态的转换。
- 转换(Transitions):定义了在特定事件发生时如何从一个状态转移到另一个状态。
- 动作(Actions):当进入某个状态或执行某些转换时可以执行的操作。
- 守卫(Guards):条件检查器,用于确定是否允许特定转换发生。
如下图示例:有限的状态集是“opend”以及“closed”。如果“现态”是“opend”,当“条件”为“Close”时,执行的“动作”是“close door”,次态则为“closed”。状态机逻辑执行完毕后“closed”则变成了“现态”。
应用场景
Spring 状态机(Spring State Machine)作为一种强大的状态管理和转换工具,在多个领域有着广泛的应用场景。以下是几个典型示例的详细解释:
1. 订单生命周期管理
在电商应用中,订单状态可能经历创建、支付、发货、确认收货直至完成或取消等多个状态变化。通过 Spring State Machine,你可以清晰地定义并控制这些状态之间的合法转换过程。例如:
- 创建订单:当用户提交订单时,状态机从初始状态
CREATED
开始。 - 支付订单:一旦支付成功,状态机接收事件
PAYMENT_RECEIVED
,从而将订单状态转移到PAID
。 - 发货:仓库系统接收到发货指令后,状态机会根据事件
SHIP_ORDER
将订单状态转移到SHIPPED
。 - 确认收货:买家确认收货后,状态机接收
DELIVERED
事件,订单进入COMPLETED
状态。 - 取消订单:如果在任意步骤出现问题,可以通过
CANCEL_ORDER
事件将订单状态转移到CANCELED
。
同时,在每个状态变迁时,可以触发相应的操作,如发送邮件通知、更新库存等。
2. 工作流引擎
在企业级应用中,诸如请假审批流程、报销流程等工作流通常具有多个步骤和决策点。状态机可以用来描述每个步骤之间的关系及转换条件,确保流程按照预设规则进行。例如:
- 发起申请:员工提交请假申请,状态机从
DRAFT
转移到SUBMITTED
。 - 主管审批:主管批准或拒绝申请,状态机根据结果转移到
APPROVED
或REJECTED
。 - HR 复核:对于特定类型的请假,可能需要 HR 进行复核,状态机进一步转移到
HR_REVIEW
。 - 最终确定:所有审批完成后,状态机最终转移到
CONFIRMED
或直接结束流程。
3. 游戏逻辑
在游戏开发中,游戏角色、游戏关卡、战斗场景等都有各自的状态。状态机可用于实现角色的不同行动模式切换、关卡过关条件判断、战斗状态循环等复杂逻辑。例如:
- 角色状态:玩家角色可以在
IDLE
、MOVING
、ATTACKING
、DEFENDING
等状态之间切换,每种状态对应不同的行为模式。 - 关卡状态:关卡可以从
START
到PLAYING
再到COMPLETED
或FAILED
,并且可以根据玩家的表现动态调整难度。 - 战斗状态:战斗场景中的状态机可以管理回合制战斗中的
PLAYER_TURN
和ENEMY_TURN
,以及处理VICTORY
或DEFEAT
结果。
4. 设备状态监控
在物联网(IoT)应用中,对设备运行状态进行实时跟踪和管理时,可以根据设备接收到的各种信号或指令触发状态转变。例如:
- 开机/待机/运行:设备根据电源开关、用户交互或其他传感器数据在
POWER_ON
、STANDBY
和RUNNING
状态间切换。 - 故障检测:设备检测到异常情况时,状态机会转移到
ERROR
状态,并触发报警机制。 - 维修状态:设备进入维修模式后,状态机保持在
MAINTENANCE
状态直到修复完成。
订单流程扭转简单示例
pom.xml 添加依赖
<dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-statemachine-starter</artifactId><version>4.0.0</version></dependency>
订单模型
这里方便演示,其他的字段根据需要自行添加
package com.coderlk.state.model;import com.coderlk.state.config.OrderStatus;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Order {private OrderStatus status;}
订单状态
package com.coderlk.state.config;/*** 订单状态*/
public enum OrderStatus {//待支付,待发货,待收货,订单结束INIT , PAYED, WAIT_DELIVERY, RECEIVED;
}
订单状态改变事件
package com.coderlk.state.config;/*** 订单状态改变事件*/
public enum OrderEvents {//支付,发货,确认收货PAY, DELIVERY, RECEIVE;
}
配置状态机
package com.coderlk.state.config;import com.coderlk.state.model.Order;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.StateMachineContext;
import org.springframework.statemachine.StateMachinePersist;
import org.springframework.statemachine.config.EnableStateMachine;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.persist.DefaultStateMachinePersister;
import org.springframework.statemachine.support.DefaultStateMachineContext;import java.util.EnumSet;/*** 订单状态机配置*/
@Configuration
@EnableStateMachine(name = "orderStateMachine")
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderStatus, OrderEvents> {/*** 配置状态** @param states* @throws Exception*/public void configure(StateMachineStateConfigurer<OrderStatus, OrderEvents> states) throws Exception {states.withStates().initial(OrderStatus.INIT).states(EnumSet.allOf(OrderStatus.class));}/*** 配置状态转换事件关系** @param transitions* @throws Exception*/public void configure(StateMachineTransitionConfigurer<OrderStatus, OrderEvents> transitions) throws Exception {transitions.withExternal().source(OrderStatus.INIT).target(OrderStatus.PAYED).event(OrderEvents.PAY).and().withExternal().source(OrderStatus.PAYED).target(OrderStatus.WAIT_DELIVERY).event(OrderEvents.DELIVERY).and().withExternal().source(OrderStatus.WAIT_DELIVERY).target(OrderStatus.RECEIVED).event(OrderEvents.RECEIVE);}/*** 持久化配置* 在实际使用中,可以配合Redis等进行持久化操作** @return*/@Beanpublic DefaultStateMachinePersister<Object,Object,Order> persister() {return new DefaultStateMachinePersister<>(new StateMachinePersist<>() {@Overridepublic void write(StateMachineContext<Object, Object> context, Order order) throws Exception {//todo 持久化处理}@Overridepublic StateMachineContext<Object, Object> read(Order order) throws Exception {//此处直接获取Order中的状态,其实并没有进行持久化读取操作return new DefaultStateMachineContext<>(order.getStatus(), null, null, null);}});}
}
处理事件
package com.coderlk.state.service;import com.coderlk.state.config.OrderStatus;
import com.coderlk.state.config.OrderEvents;
import com.coderlk.state.model.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.Message;
import org.springframework.statemachine.annotation.OnTransition;
import org.springframework.statemachine.annotation.WithStateMachine;
import org.springframework.stereotype.Component;@Component("orderStateListener")
@Slf4j
@WithStateMachine(name = "orderStateMachine")
public class OrderStateListener {@OnTransition( source = "INIT" ,target = "PAYED")public boolean pay(Message<OrderEvents> message) {Order order = (Order) message.getHeaders().get("order");order.setStatus(OrderStatus.PAYED);log.info("订单表保存数据");log.info("发送站内消息");log.info("回调支付接口");log.info("同步至数据仓库");return true;}@OnTransition( source = "PAYED" , target = "WAIT_DELIVERY")public boolean delivery(Message<OrderEvents> message) {Order order = (Order) message.getHeaders().get("order");order.setStatus(OrderStatus.WAIT_DELIVERY);log.info("创建物流订单");log.info("更新物流订单状态");log.info("同步至数据仓库");return true;}@OnTransition(source = "SHIPPED" , target = "RECEIVED")public boolean receive(Message<OrderEvents> message){Order order = (Order) message.getHeaders().get("order");order.setStatus(OrderStatus.PAYED);log.info("更新订单数据");log.info("同步至数据仓库");return true;}
}
package com.coderlk.state.service;import com.coderlk.state.config.OrderStatus;
import com.coderlk.state.config.OrderEvents;
import com.coderlk.state.model.Order;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.persist.StateMachinePersister;
import org.springframework.stereotype.Component;@Component("orderProcessor")
@Slf4j
public class OrderProcessor {@Resourceprivate StateMachine<OrderStatus, OrderEvents> orderStateMachine;@Resourceprivate StateMachinePersister<OrderStatus, OrderEvents, Order> persister;public Boolean process(Order order, OrderEvents event){Message<OrderEvents> message = MessageBuilder.withPayload(event).setHeader("order", order).build();boolean b = sendEvent(message);return b;}@SneakyThrowsprivate boolean sendEvent(Message<OrderEvents> message) {Order order = (Order) message.getHeaders().get("order");persister.restore(orderStateMachine, order);boolean result = orderStateMachine.sendEvent(message);return result;}
}
启动
package com.coderlk.state;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class StateMachineApplication {public static void main(String[] args) {SpringApplication.run(StateMachineApplication.class, args);}}
测试
支付流程
2024-12-24T15:26:19.088+08:00 INFO 44471 --- [ main] c.c.state.service.OrderStateListener : 订单表保存数据
2024-12-24T15:26:19.088+08:00 INFO 44471 --- [ main] c.c.state.service.OrderStateListener : 发送站内消息
2024-12-24T15:26:19.088+08:00 INFO 44471 --- [ main] c.c.state.service.OrderStateListener : 回调支付接口
2024-12-24T15:26:19.089+08:00 INFO 44471 --- [ main] c.c.state.service.OrderStateListener : 同步至数据仓库
如果读者对其他流程感兴趣,可以自行测试
相关文章:
SpringBoot状态机
Spring Boot 状态机(State Machine)是 Spring Framework 提供的一种用于实现复杂业务逻辑的状态管理工具。它基于有限状态机(Finite State Machine, FSM)的概念,允许开发者定义一组状态、事件以及它们之间的转换规则。…...
细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV
目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH (1)w25flash.h (2) w25flash.c 1)W25Q16基本操作指令 2)计算地址的辅助功能函数 3)器…...
HTMLCSS:惊!3D 折叠按钮
这段代码创建了一个具有 3D 效果和动画的按钮,按钮上有 SVG 图标和文本。按钮在鼠标悬停时会显示一个漂浮点动画,图标会消失并显示一个线条动画。这种效果适用于吸引用户注意并提供视觉反馈。按钮的折叠效果和背景渐变增加了页面的美观性。 演示效果 HT…...
如何更好的进行时间管理
先想一下我们想要做的事情,然后拿出Excel表格将这些事情记录下来,我们把它叫做任务对这些任务按照重要性,紧急程度进行排序,拿出表格中的前六个任务,就是今天要做的任务新建另一张excel表格,表格的一列为时…...
我在华为的安全日常
在华为工作了数年后,我养成了一个习惯:每次离开座位,即便是去卫生间,我也会条件反射地锁屏电脑。晚上回到家,躺在床上,脑海中偶尔会闪过一丝疑虑:办公室的门窗是否关好?虽然这种担忧…...
for媒体打破智能座舱体验同质化,斑马智行荣获“华舆奖”优秀创
打破智能座舱体验同质化,斑马智行荣获“华舆奖”优秀创新生态伙伴 12月12日,消费者洞察与市场研究机构J.D. Power|君迪与同济大学 HVR Lab(人车关系实验室)共同发布了 2024 中国智能座舱的研究洞察,并公布了华舆奖中国…...
自己搭建专属AI:Llama大模型私有化部署
前言 AI新时代,提高了生产力且能帮助用户快速解答问题,现在用的比较多的是Openai、Claude,为了保证个人隐私数据,所以尝试本地(Mac M3)搭建Llama模型进行沟通。 Gpt4all 安装比较简单,根据 G…...
芯片Tapeout power signoff 之IR Drop Redhawk Ploc文件格式及其意义
数字IC后端工程师在芯片流程最后阶段都会使用redhawk或voltus进行设计的IR Drop功耗signoff分析。必须确保静态,动态ir drop都符合signoff标准。 在做redhawk ir drop分析前,我们需要提供一个redhawk ploc供电点坐标。 数字IC设计后端实现前期预防IR D…...
[机器学习]sklearn入门指南(1)
简介 scikit-learn(简称sklearn)是一个开源的Python机器学习库,它提供了简单而高效的工具用于数据挖掘和数据分析,并且拥有一个活跃的开发社区。它建立在NumPy、SciPy和matplotlib这些科学计算库之上,旨在提供一致且可…...
GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台
GoIoT 是基于Gin 的开源分布式物联网(IoT)开发平台,用于快速开发,部署物联设备接入项目,是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台,它是一个企业级物联网平台解决方案ÿ…...
【R语言遥感技术】“R+遥感”的水环境综合评价方法
R语言在遥感领域中是一个强大的工具,它提供了一系列的功能和优势,使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用: 数据处理:R语言可以处理和清洗遥感数据,包括数据转换、滤波处理、去噪和数…...
QT--信号与槽机制
什么是信号与槽? 在 Qt 中,信号与槽是一种用于对象间通信的机制。它使得一个对象可以通知其他对象某个事件的发生,而不需要直接知道这些对象的具体实现。这种机制非常适合事件驱动的编程模型,如用户界面交互。 1. 信号ÿ…...
Windbg常用命令
禁止垃圾信息 ed nt!Kd_STORMINIPORT_Mask 0 ed nt!Kd_SXS_Mask 0 ed nt!Kd_FUSION_Mask 0 命令大全: 命令 - Windows drivers | Microsoft Learn .reload /f 重新加载符号表 常用命令 继续执行: g单步过/步入: p, t退出: q查看调用堆栈: k, kb列出模块: lm, lml设置断…...
YOLO11改进-模块-引入多分支卷积InceptionDepthwiseConvolution(IDC) 解决多尺度、小目标
YOLOv11 的设计目标是通过高效的网络结构,在保证准确率的前提下,最大化推理速度。传统卷积操作虽然能够捕获局部信息,但在处理大规模场景或复杂背景时,较小的感受野可能导致细节信息不足,影响模型的检测能力。为了解决…...
国标GB28181-2022平台EasyGBS:安防监控中P2P的穿透方法
在安防监控领域,P2P技术因其去中心化的特性而受到关注,尤其是在远程视频监控和数据传输方面。P2P技术允许设备之间直接通信,无需通过中央服务器,这在提高效率和降低成本方面具有明显优势。然而,P2P技术在实际应用中也面…...
C++软件设计模式之外观(Facade)模式
C软件设计模式中的外观(Facade)模式 1. 外观模式的定义 外观模式(Facade Pattern)是一种结构型设计模式,它为一个复杂的子系统提供一个简化的接口。外观模式通过一个统一的接口来访问子系统的多个组成部分࿰…...
Spring Boot 项目创建
创建一个新项目: 打开 Spring Initializr 网址:https://start.spring.io/ ,然后创建一个新项目: springboot3.3.5_jdk17: Project(Maven)编程语言(Java 17)Spring Boo…...
SharpDX 从入门到精通:全面学习指南
摘要: 本文旨在为想要深入学习 SharpDX 的开发者提供一份全面的指南。从 SharpDX 的基础概念入手,逐步深入探讨其在不同场景下的应用,包括图形渲染、音频处理等,并结合大量详细的代码案例帮助读者更好地理解和掌握 SharpDX 的使用…...
【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)
最近在忙联通的安全准入测试,很少有时间看CTF了,今晚抽点时间回顾下上周线下的题(期末还没开始复习😢) 感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞,没啥惊喜感,还是CTF有意思 目录 Mountain ez_zhuawa 图…...
操作系统(24)提高磁盘I/O速度的途径
前言 操作系统提高磁盘I/O速度的途径多种多样,这些途径旨在减少磁盘访问的延迟和开销,提高数据传输的效率。 一、磁盘高速缓存(Disk Cache) 磁盘高速缓存是一种在内存中为磁盘数据设置的缓冲区,用于存储磁盘中某些盘块…...
en3d 部署笔记
目录 依赖项: Nvdiffrast 编译代码和frpc_linux_amd64 下载地址: tiny-cuda-nn 安装 ICON算法库依赖 icon依赖 kaolin infer_normal_fixpose 解决 报错了,推荐的安装方法: kaolin测试: ICON依赖项 requirements.txt 改进 voxelize_cuda 安装ok 运行后: 修改代…...
c++类型判断和获取原始类型
std::traits学习 类型判断和退化(获取原始类型)的原理就是利用模板的特例化。根据调用模板的特例化,在特例化模板中实现判断的逻辑或者退化的逻辑。 一、类型判断 判断整型数据的模板类 #include <iostream> namespace zk {templa…...
医疗行业 UI 设计系列合集(一):精准定位
在当今数字化时代,医疗行业与信息技术的融合日益紧密,UI 设计在其中扮演着至关重要的角色。精准定位的 UI 设计能够显著提升医疗产品与服务的用户体验,进而对医疗效果和患者满意度产生积极影响。 一、医疗行业 UI 设计的重要性概述 医疗行业…...
EasyExcel停更,FastExcel接力
11月6日消息,阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布,将停止更新,未来将逐步进入维护模式,将继续修复Bug,但不再主动新增功能。 EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称,官方…...
java agent的使用【通俗易懂版】
一、静态代理Agent 1.生成Agent的jar包 (1)创建Agent项目,引入javassist.jar包 (2)编写premain方法 import java.lang.instrument.Instrumentation;public class Agent1 {public static void premain(Stri…...
010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)
文章目录 前言一、QLineEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:用户登录界面5.示例二:验证两次输入的密码是否一致显示密码 二、TextEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:获取多行输入框的内容5.示例二&#x…...
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
什么是享元模式? 享元模式是一个非常实用的结构型设计模式,它的主要目的是节省内存,尤其在需要创建大量相似对象时。 通俗解释: 想象我们在写一本书,每个字母都需要表示出来。如果每个字母都单独用对象表示ÿ…...
机器学习之 KNN 算法
一、引言 在机器学习领域中,K 近邻(K-Nearest Neighbors,KNN)算法是一种简单而有效的分类和回归算法。它的基本思想是根据数据点之间的距离来确定它们的相似性,并根据其最近的邻居的类别或数值来预测新数据点的类别或…...
矩阵:Input-Output Interpretation of Matrices (中英双语)
矩阵的输入-输出解释:深入理解与应用 在线性代数中,矩阵与向量的乘积 ( y A x y Ax yAx ) 是一个极为重要的关系。通过这一公式,我们可以将矩阵 ( A A A ) 看作一个将输入向量 ( x x x ) 映射到输出向量 ( y y y ) 的线性变换。在这种…...
ctfhub技能树——disable_functions
LD_PRELOAD 来到首页发现有一句话直接就可以用蚁剑连接 根目录里有/flag但是不能看;命令也被ban了就需要绕过了 绕过工具在插件市场就可以下载 如果进不去的话 项目地址: #本地仓库;插件存放 antSword\antData\plugins 绕过选择 上传后我们点进去可以看到多了一个绕过的文件;…...
Web3.0安全开发实践:探索比特币DeFi生态中的PSBT
近年来,部分签名比特币交易(PSBT)在比特币生态系统中获得了显著关注。随着如Ordinal和基于铭文的资产等创新的兴起,安全的多方签名和复杂交易的需求不断增加,这使得PSBT成为应对比特币生态不断发展中不可或缺的工具。 …...
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
文章目录 前言问题描述问题分析问题解决1.允许所有用户上传驱动文件2.如果是想只上传白名单的驱动 前言 该方法适合永洪BI系列产品,包括不限于vividime desktop,vividime z-suit,vividime x-suit产品。 问题描述 当我们连接数据源的时候&a…...
Lecture 6 Isolation System Call Entry
文章目录 一 重要的函数清单1 write(user/usys.s) 一 usertrap函数(C code) Lecture6 Isolation & System Call Entry视频链接 对应XV6 Book Chapter 4 Traps and device drivers 一 重要的函数清单 1 write(user/usys.s) .global write write:li a7, SYS_writeecallret…...
重温设计模式----装饰模式
文章目录 装饰模式定义UML 图其主要优点包括:装饰模式的主要角色有:C 代码示例总结 装饰模式定义 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式必生成子类更加灵活 装饰模式(Decorator Pattern&…...
图像处理-Ch2-空间域的图像增强
Ch2 空间域的图像增强 文章目录 Ch2 空间域的图像增强Background灰度变换函数(Gray-level Transformation)对数变换(Logarithmic)幂律变换(Power-Law)分段线性变换函数(Piecewise-Linear)对比度拉伸(Contrast-Stretching)灰度级分层(Gray-level Slicing) 直方图处理(Histogram …...
uniapp Native.js原生arr插件服务发送广播到uniapp页面中
前言 最近搞了个设备,需求是读取m1卡,厂家给了个安卓原生demo,接入arr插件如下,接入后发现还是少了一部分代码,设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录,最后面是解决办法…...
重温设计模式--1、组合模式
文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...
关于鸿蒙架构feature
鸿蒙feature层模块架构 model:定义数据类型,进行接口请求 view:视图层 写UI viewModel:控制层 关于逻辑和请求调用 page页...
CentOS下,离线安装vscode的步骤;
前置条件: 1.CentOS7; 步骤: 1.下载vscode指定版本,例如; 例如 code-1.83.1-1696982959.el7.x86_64.rpm 2.使用下面命令: sudo rpm -ivh code-1.83.1-1696982959.el7.x86_64.rpm 其他: 卸载vscode的命…...
.NET周刊【12月第3期 2024-12-15】
国内文章 重磅推出 Sdcb Chats:一个全新的开源大语言模型前端 https://www.cnblogs.com/sdcb/p/18597030/sdcb-chats-intro Sdcb Chats是一个新推出的开源大语言模型前端,旨在提升用户交互体验,并填补市场上基于.NET的前端空白。它引入树状…...
操作系统(23)外存的存储空间的管理
一、外存的基本概念与特点 定义:外存,也称为辅助存储器,是计算机系统中用于长期存储数据的设备,如硬盘、光盘、U盘等。与内存相比,外存的存储容量大、成本低,但访问速度相对较慢。特点:外存能够…...
vue3中多层级路由缓存失效问题
问题现象: 在项目中路由嵌套了超过两层后,使用keep-alive对路由进行页面的缓存,发现并不能生效。 使用的路由结构: // 一级路由path: menu1,component: () > import(/views/demos/nested/menu1/index), // Parent router-vie…...
Kerberoasting 离线爆破攻击
当域用户请求某个域内服务后,kdc 通常会返回一个加密的 st 服务票据,此 st 服务票据被服务 hash 加密,当我们将使用密码字典派生的多个 hash 值来尝试解密 st 服务票据,如果能够揭秘成功,则说明字典中存在目标服务账号…...
无人机双目视觉鲁棒定位方法!
无人机双目视觉鲁棒定位方法是一种先进的定位技术,它利用两个摄像头(即双目相机)模拟人的视觉系统,通过视差来确定物体的位置。这种方法在无人机定位领域具有广泛的应用前景,特别是在GPS信号拒止或弱纹理环境中&#x…...
vulnhub靶场——Log4j2
第一步:搭建靶场环境 #开启环境 cd vulhub/log4j/CVE-2021-44228 docker-compose up -d 来到网站首页 第二步:搭建一个dnslog平台上获取我们注入的效果 第三步:发现 /solr/admin/cores?action 这里有个参数可以传 我们可以看到留下了访问记录并且前面的参数被执行后给我们回…...
第十六章 C++ 字符串
C 字符串 C 提供了以下两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 终止的一维字符数组。因此,一个以 null 结尾的…...
centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!
在 CentOS 系统中,权限管理是操作系统的核心功能之一,确保不同用户和进程对文件、目录以及设备的访问被合理控制。 权限系统主要包括传统的 Unix 权限模型、特殊权限(SetUID、SetGID、Sticky 位)和更精细的访问控制列表ÿ…...
【k8s】访问etcd
1. 配置 export.sh export ETCDCTL_API3 # Kubernetes 1.13 使用 API v3 export ETCDCTL_ENDPOINTShttps://[2023:145:246:270::3]:2379 # etcd API endpoint,通常为集群内的 etcd 服务地址 export ETCDCTL_CACERT/etc/kubernetes/certs/ca.crt # CA 证书文件 …...
【教程宝典】基于“遥感+”蓝碳储量估算、红树林信息提取实践技术应用与科研论文写作
“遥感”助推蓝碳生态系统碳储量调查简介(1)蓝碳生态系统碳储量研究背景 红树林、海草床和盐沼是海岸带最具固碳效率的三大生态系统,统称为“蓝色碳汇”。虽然这三类生态系统的覆盖面积不到海床的0.5%,植物生物量只占陆地植物生物量的0.05%,…...
运动健康中的实体和关系
1. 实体类别 1.1 个人健康相关实体 个人(Person):参与体育活动的个体,如运动员、健身爱好者、患者等。健康状况(HealthStatus):描述个人的身体状态,如体重、血压、心率、身体质量指…...