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

Spring中的数据校验

数据校验基础

参考: Java Bean Validation 规范

Spring对Bean Validation的支持

Spring定义了一个接口org.springframework.validation.Validator,用于应用相关的对象的校验器。

这个接口完全从基础设施或者上下文中脱离的,这意味着它没有跟web层或者数据访问层或者其余任何的某一个层次发生耦合。所以它能用于应用中的任意一个层次,能对应用中的任意一个对象进行校验。

接口定义

public interface Validator {// 此clazz是否可以被validateboolean supports(Class<?> clazz);// 执行校验,错误消息放在Errors中// 如果能执行校验,通常也意味着supports方法返回true// 可以参考ValidationUtils这个工具类void validate(Object target, Errors errors);
}

接口实现

image-20230216155742364

SmartValidator

对Validator接口进行了增强,能进行分组校验

public interface SmartValidator extends Validator {// validationHints:就是启动的校验组// target:需要校验的结果// errors:封装校验void validate(Object target, Errors errors, Object... validationHints);// 假设value将被绑定到指定对象中的指定字段上,并进行校验// @since 5.1  这个方法子类需要复写 否则不能使用default void validateValue(Class<?> targetType, String fieldName, @Nullable Object value, Errors errors, Object... validationHints) {throw new IllegalArgumentException("Cannot validate individual value for " + targetType);}
}

SpringValidatorAdapter

SpringValidatorAdapter实现了对 Bean Validation适配

// 可以看到,这个接口同时实现了Spring中的SmartValidator接口跟JSR中的Validator接口
public class SpringValidatorAdapter implements SmartValidator, javax.validation.Validator {//约束必须使用的3个属性private static final Set<String> internalAnnotationAttributes = new HashSet<>(4);static {internalAnnotationAttributes.add("message");internalAnnotationAttributes.add("groups");internalAnnotationAttributes.add("payload");}// targetValidator就是实际完成校验的对象@Nullableprivate javax.validation.Validator targetValidator;public SpringValidatorAdapter(javax.validation.Validator targetValidator) {Assert.notNull(targetValidator, "Target Validator must not be null");this.targetValidator = targetValidator;}SpringValidatorAdapter() {}void setTargetValidator(javax.validation.Validator targetValidator) {this.targetValidator = targetValidator;}// 支持对所有类型的Bean的校验@Overridepublic boolean supports(Class<?> clazz) {return (this.targetValidator != null);}// 调用targetValidator完成校验,并通过processConstraintViolations方法封装校验后的结果到Errors中@Overridepublic void validate(Object target, Errors errors) {if (this.targetValidator != null) {processConstraintViolations(this.targetValidator.validate(target), errors);}}// 完成分组校验@Overridepublic void validate(Object target, Errors errors, Object... validationHints) {if (this.targetValidator != null) {processConstraintViolations(this.targetValidator.validate(target, asValidationGroups(validationHints)), errors);}}// 完成对对象上某一个字段及给定值的校验@SuppressWarnings("unchecked")@Overridepublic void validateValue(Class<?> targetType, String fieldName, @Nullable Object value, Errors errors, Object... validationHints) {if (this.targetValidator != null) {processConstraintViolations(this.targetValidator.validateValue((Class) targetType, fieldName, value, asValidationGroups(validationHints)), errors);}}// @since 5.1// 将validationHints转换成JSR中的分组private Class<?>[] asValidationGroups(Object... validationHints) {Set<Class<?>> groups = new LinkedHashSet<>(4);for (Object hint : validationHints) {if (hint instanceof Class) {groups.add((Class<?>) hint);}}return ClassUtils.toClassArray(groups);}// 省略对校验错误的封装// .....// 省略对JSR中validator接口的实现,都是委托给targetValidator完成的// ......}

ValidatorAdapter

SpringValidatorAdapter同一级别的类,但是不同的是他没有实现JSR中的Validator接口。一般不会使用这个类。

它实现了对 SmartValidator 的适配。

public class ValidatorAdapter implements SmartValidator, ApplicationContextAware, InitializingBean, DisposableBean {private final SmartValidator target;private final boolean existingBean;ValidatorAdapter(SmartValidator target, boolean existingBean) {this.target = target;this.existingBean = existingBean;}public final Validator getTarget() {return this.target;}@Overridepublic boolean supports(Class<?> clazz) {return this.target.supports(clazz);}//... ... 
}

CustomValidatorBean

配置一个bean,暴露一个 JSR-303 Validator,使用了 JSR 的3个接口。

public class CustomValidatorBean extends SpringValidatorAdapter implements Validator, InitializingBean {@Nullableprivate ValidatorFactory validatorFactory;@Nullableprivate MessageInterpolator messageInterpolator;@Nullableprivate TraversableResolver traversableResolver;
}

LocalValidatorFactoryBean

OptionalValidatorFactoryBean

继承了LocalValidatorFactoryBean,区别在于让校验器的初始化成为可选的,即使校验器没有初始化成功也不会报错。

@Validated跟@Valid的区别

定义

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {// 校验时启动的分组Class<?>[] value() default {};
}
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
public @interface Valid {//没有提供任何属性
}

区别

  • 来源不同:@Valid是JSR的规范,来源于javax.validation包下,而@Validated是Spring自身定义的注解,位于org.springframework.validation.annotation包下

  • 作用范围不同:@Validated无法作用在字段上,正因为如此它就无法完成对级联属性的校验。而@Valid的没有这个限制。

  • 注解中的属性不同:@Validated注解中可以提供一个属性去指定校验时采用的分组,而@Valid没有这个功能,因为@Valid不能进行分组校验

应用

准备

待校验的类:

@Data
public class ValidatedData {@NotNullpublic String name;@Positivepublic Integer age;@NotNull@NotEmptyprivate List<@Email String> emails;/*** 定义的2个组,以接口的形式*/public interface GroupA {}public interface GroupB {}}/*** 外部验证数据,用于级联验证** @author lihz* @date 2023/2/18*/
@Data
public class OuterValidatedData {@NotNullString name;@ValidValidatedData validatedData;
}

测试Controller:

package com.jurassic.cloud.project.controller;import com.jurassic.cloud.project.dto.OuterValidatedData;
import com.jurassic.cloud.project.dto.ValidatedData;
import com.jurassic.cloud.project.service.impl.ValidationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;@RestController
@RequestMapping("/validate")
public class ValidationController {@AutowiredValidationService validationService;@PostMapping("/valid")public String testValid(@RequestBody @Valid ValidatedData data) {System.out.println(data);return "OK";}@PostMapping("/validated")public String testValidated(@RequestBody @Validated ValidatedData data) {System.out.println(data);return "OK";}@PostMapping("/valid/nest")public String testValidNest(@RequestBody @Valid OuterValidatedData data) {System.out.println(data);return "OK";}@PostMapping("/validated/nest")public String testValidatedNest(@RequestBody @Validated OuterValidatedData data) {System.out.println(data);return "OK";}@PostMapping("/valid/method")public String testValidMethod(@RequestBody ValidatedData data) {validationService.testValid(data);return "OK";}@PostMapping("/validated/method")public String testValidatedMethod(@RequestBody ValidatedData data) {validationService.testValidated(data);return "OK";}@PostMapping("/valid/nest/method")public String testValidNestMethod(@RequestBody OuterValidatedData data) {validationService.testValidNest(data);return "OK";}@PostMapping("/validated/nest/method")public String testValidatedNestMethod(@RequestBody OuterValidatedData data) {validationService.testValidatedNest(data);return "OK";}@PostMapping("/valid/simple")public String testValid(@Valid @Max(10) int age, @Valid @NotBlank String name) {System.out.println(age + "      " + name);return "OK";}@PostMapping("/validated/simple")public String testValidated(@Validated @Max(10) int age, @Validated @NotBlank String name) {System.out.println(age + "      " + name);return "OK";}@PostMapping("/non/method/simple")public String testNonMethodSimple(@Max(10) int age, @NotBlank String name) {validationService.testNon(age, name);return "OK";}@PostMapping("/valid/method/simple")public String testValidMethodSimple(@Max(10) int age, @NotBlank String name) {validationService.testValid(age, name);return "OK";}@PostMapping("/validated/method/simple")public String testValidatedMethodSimple(@Max(10) int age, @NotBlank String name) {validationService.testValidated(age, name);return "OK";}
}

测试数据:

{"name": "demon","age": -1,"emails": ["demon7552003@hotmail.com"]
}{"name": "xxxxx","data": {"name": "demon","age": -1,"emails": ["demon7552003@hotmail.com"]}
}

测试服务

package com.jurassic.cloud.project.service.impl;import com.jurassic.cloud.project.dto.OuterValidatedData;
import com.jurassic.cloud.project.dto.ValidatedData;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;/***** @author lihz* @date 2023/2/18*/
@Service
//@Validated
@Valid
public class ValidationService {public void testValid(@Valid ValidatedData data) {System.out.println(data);}public void testValidated(@Validated ValidatedData data) {System.out.println(data);}public void testValidNest(@Valid OuterValidatedData data) {System.out.println(data);}public void testValidatedNest(@Validated OuterValidatedData data) {System.out.println(data);}public void testNon(  @Max(10) int age,  @NotBlank String name) {System.out.println(age+"     "+name);}public void testValid(@Valid @Max(10) int age,@Valid @NotBlank String name) {System.out.println(age+"     "+name);}public void testValidated(@Validated   @Max(10) int age, @Validated  @NotBlank String name) {System.out.println(age+"     "+name);}}

对JavaBean的校验(Controller层)

测试结果

  • valid测试

    {"code": 1,// age 必须是正数"msg": "Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValid(com.jurassic.cloud.project.dto.ValidatedData): [Field error in object 'validatedData' on field 'age': rejected value [-1]; codes [Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [validatedData.age,age]; arguments []; default message [age]]; default message [必须是正数]] ","data": null
    }
    
  • validated测试

{"code": 1,"msg": "Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValidated(com.jurassic.cloud.project.dto.ValidatedData): [Field error in object 'validatedData' on field 'age': rejected value [-1]; codes [Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [validatedData.age,age]; arguments []; default message [age]]; default message [必须是正数]] ","data": null
}
  • valid测试 嵌套数据

    {"code": 1,"msg": "Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValidNest(com.jurassic.cloud.project.dto.OuterValidatedData): [Field error in object 'outerValidatedData' on field 'validatedData.age': rejected value [-1]; codes [Positive.outerValidatedData.validatedData.age,Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [outerValidatedData.validatedData.age,validatedData.age]; arguments []; default message [validatedData.age]]; default message [必须是正数]] ","data": null
    }
    
  • validated测试 嵌套数据

    {"code": 1,"msg": "Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValidatedNest(com.jurassic.cloud.project.dto.OuterValidatedData): [Field error in object 'outerValidatedData' on field 'validatedData.age': rejected value [-1]; codes [Positive.outerValidatedData.validatedData.age,Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [outerValidatedData.validatedData.age,validatedData.age]; arguments []; default message [validatedData.age]]; default message [必须是正数]] ","data": null
    }
    

总结

从结果上看 @Valid@Validated 都能触发级联验证。

如果要触发属性的级联验证,一定要放注解 @Valid

对普通方法的JavaBean校验

测试结果

Service类上不加注解

  • valid测试

    OK
    
  • validated测试

    ok
    
  • valid测试 嵌套数据

    OK
    
  • validated测试 嵌套数据

    OK
    

Service类上加@Valid

  • valid测试

    OK
    
  • validated测试

    ok
    
  • valid测试 嵌套数据

    OK
    
  • validated测试 嵌套数据

    OK
    

Service类上加@Validated

  • valid测试

    {"code": 1,"msg": "testValid.data.age: 必须是正数","data": null
    }
    
  • validated测试

    ok
    
  • valid测试 嵌套数据

    {"code": 1,"msg": "testValidNest.data.validatedData.age: 必须是正数","data": null
    }
    
  • validated测试 嵌套数据

    OK
    

总结

只有类上添加了@Vlidated注解,并且待校验的**JavaBean上添加了@Valid**的情况下校验才会生效。

返回的异常信息包含了 进行验证的方法的名称,以及验证的属性

对简单参数的校验(Controller层)

测试结果

1、测试:http://127.0.0.1:8073/validate/valid/simple?age=20&name=demon

结果:OK

2、测试:http://127.0.0.1:8073/validate/validated/simple?age=20&name=demon

结果:OK

结论

参数上,不论加 @Valid 还是 @Validated ,都不会触发验证。

对简单参数的校验(Service层)

测试结果

1、测试:http://127.0.0.1:8073/validate/valid/simple?age=20&name=demon

结果:OK

2、测试:http://127.0.0.1:8073/validate/validated/simple?age=20&name=demon

结果:OK

结论

参数上,不论加 @Valid 还是 @Validated ,都不会触发验证。

对普通方法上的简单参数的校验(Service层)

1、参数不加注解: http://127.0.0.1:8073/validate/non/method/simple?age=20

2、参数加@Valid: http://127.0.0.1:8073/validate/valid/simple?age=20

3、参数加@Validated:http://127.0.0.1:8073/validate/validated/simple?age=20

测试结果

Service类上不加注解

1、OK

2、OK

3、OK

Service类上加@Valid

1、OK

2、OK

3、OK

Service类上加@Validated

1、

{"code": 1,"msg": "testNon.age: 最大不能超过10, testNon.name: 不能为空","data": null
}

2、

{"code": 1,"msg": "testValid.name: 不能为空, testValid.age: 最大不能超过10","data": null
}

3、

{"code": 1,"msg": "testValidated.age: 最大不能超过10, testValidated.name: 不能为空","data": null
}

结论

参数上,不论加 @Valid 还是 @Validated,或者不加 ,都不会影响结果。

仅在类上加 @Validated 时,才会触发简单参数的验证。

普通方法验证的总结

仅在类上加@Validated 时,才会触发参数的验证。对于非简单类的验证,必须加 @Valid 触发级联验证。

Controller层验证的总结

仅能验证非简单类型

从结果上看 @Valid@Validated 都能触发级联验证。

如果要触发属性的级联验证,一定要放注解 @Valid

Spring对JSR的适配

在普通方法上的验证,抛出异常ConstraintViolationException,在Controller层抛出的异常是MethodArgumentNotValidException。Spring对参数绑定做了封装,错误信息被封装为BindingResult,在方法RequestResponseBodyMethodProcessor#resolveArgument中做处理。

全局异常处理

通过@RestControllerAdvice 做AOP。

@RestControllerAdvice
public class MethodArgumentNotValidExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Result handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {BindingResult bindingResult = ex.getBindingResult();StringBuilder stringBuilder = new StringBuilder();for (FieldError error : bindingResult.getFieldErrors()) {String field = error.getField();Object value = error.getRejectedValue();String msg = error.getDefaultMessage();String message = String.format("错误字段:%s,错误值:%s,原因:%s;", field, value, msg);stringBuilder.append(message).append("\r\n");}return Result.error(MsgDefinition.ILLEGAL_ARGUMENTS.codeOf(), stringBuilder.toString());}
}

附录

参考

官网:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/spring-framework-reference/core.html#validation-beanvalidation

相关文章:

Spring中的数据校验

数据校验基础 参考&#xff1a; Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator&#xff0c;用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的&#xff0c;这意味着它没有…...

python批量翻译excel表格中的英文

python批量翻译excel表格中的英文需求背景主要设计分析具体实现表格操作请求百度翻译api多线程控制台显示进度完整源码需求背景 女朋友的论文需要爬取YouTube视频热评&#xff0c;但爬下来的都是外文。 主要设计 读取一个表格文件&#xff0c;获取需要翻译的文本 使用百度翻译…...

基于SSM框架的RBAC权限系统设计与 实现

基于SSM框架的RBAC权限系统设计与 实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景…...

目标检测各常见评价指标详解

注&#xff1a;本文仅供学习&#xff0c;未经同意请勿转载 说明&#xff1a;该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在&#xff1a;待上传 目录 常见的评价指标 准确率 &#xff08;Accuracy&#xff09; 混淆矩阵 &#xff08;Confusion Matrix&#xff…...

深入讲解Kubernetes架构-控制器

在机器人技术和自动化领域&#xff0c;控制回路&#xff08;Control Loop&#xff09;是一个非终止回路&#xff0c;用于调节系统状态。这是一个控制环的例子&#xff1a;房间里的温度自动调节器。当你设置了温度&#xff0c;告诉了温度自动调节器你的期望状态&#xff08;Desi…...

Urho3D本地化 国际化

本地化子系统提供了创建多语言应用程序的简单方法。 初始化 在使用子系统之前&#xff0c;需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件&#xff0c;每个集合文件只能定义一种或多种语言。例如&#xff1a; Localization* l10n…...

千锋教育嵌入式物联网教程之系统编程篇学习-04

目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember()​ sigaddset()​ sigdelset()​ 代码讲解 信号阻塞集 sigprocmask()​ alarm函数 相当于一个闹钟&#xff0c;默认动作是终止调用alarm函数的进…...

【运维】什么是 DevOps?

文章目录什么是 DevOps&#xff1f;如何实现 DevOpsDevOps工作原理&#xff1a; DevOps生命周期DevOps 文化DevOps 工具&#xff1a;构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps&#xff1f;DevOps 和站点可靠性工程 (SRE)什么是 DevOps&#xff1f; DevOps 通过结…...

【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)

文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点&#xff1f;C有哪些技术替代宏&#xff1f;auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&…...

《FPGA学习》->多个按键控制LED灯

&#x1f34e;与其担心未来&#xff0c;不如现在好好努力。在这条路上&#xff0c;只有奋斗才能给你安全感。你若努力&#xff0c;全世界都会为你让路。本次项目任务&#xff0c;利用开发板上的4个按键KEY1&#xff0c;KEY2&#xff0c;KEY3&#xff0c;KEY4和2个LED灯LED1&…...

vb.net计算之.net core基础(4)-项目与程序结构(2)

目录 Namespace 语句Visual Basic 中的命名空间完全限定名命名空间可以定义什么全局关键字命名规范条件编译拆分和合并语句拆分成多行在同一行上放置多个语句为代码行添加标签注释串联成员访问运算符点运算符 `.`感叹号 `!`运算符Me 关键字MyMyBaseMyClassNamespace 语句 <…...

基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)

我们通常情况下&#xff0c;芯片进入uboot后&#xff0c;会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键&#xff0c;即可退出autoboot&#xff0c;进入uboot的命令行模式。 官方提供的uboot源码中&#xff0c;为了防止调试串口干扰导致不能进入系统&#xff0c…...

Lumerical---在FDTD和MODE工程中的PML边界条件

Lumerical---在FDTD和MODE工程中的PML边界条件 引言PML边界条件实现原理PML 类型PML 配置文件PML 配置文件选项Standard(标准)Stabilized(稳定性)Steep AngleCustom(陡角)对于不同的边界使用不同的配置FDE,varFDTD和FDTD SolverPML 参数阅读这篇前,推荐阅读边界条件综述…...

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

KVM-4、KVM 高级功能详解

1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x 、AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。 QEMU/KVM 提供了全虚拟化环境,可以让客户机不经…...

【Linux】进程状态

文章目录1. 阻塞1. 举例2. 为什么要阻塞&#xff1f;3.操作系统层面上如何理解进程等待某种资源就绪呢&#xff1f;资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态&#xff0c;就一定是在CPU运行吗&#xff1f;证明当前进程运行状态生成程序查看进程2. S休眠状态…...

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固&#xff08;200分&#xff09; A-1&…...

pygame8 扫雷游戏

一、游戏规则&#xff1a; 1、点击方格&#xff0c;如果是地雷&#xff0c;游戏失败&#xff0c;找到所有地雷游戏胜利 2、如果方块上出现数字&#xff0c;则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑&#xff1a; 主要逻辑即调用run_game, 然后循环检测事件…...

c/c++开发,无可避免的模板编程实践(篇四)

一、容器与模板 前文就说到&#xff0c;标准库基于模板编程&#xff0c;定义了许多容器类以及一系列泛型算法&#xff0c;使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器&#xff0c;这些容器通常包含一组数据或对象的集合&#xff0c;几乎可以和任何类…...

c++11 标准模板(STL)(std::unordered_set)(二)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...