关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)
注:另一种方式参考
关于@TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)http://t.csdnimg.cn/NZy4G
1.简介
1.1 序列化与反序列化
学习注解之前,我们可以先了解一下什么是序列化与反序列化?
1.1.1序列化
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。通常,对象会被转换为字节序列,这样它们就可以被写入文件、存储在数据库中,或者通过网络发送给其他计算机。
目的:
- 持久化:将对象的状态保存到文件或数据库中,以便在程序下次运行时可以恢复对象的状态。
- 网络传输:通过将对象转换为字节序列,可以在网络上传输对象的状态,使得分布式系统中的不同部分可以共享数据。
过程:
- 确定对象的状态:选择需要保存的属性或字段。
- 转换为字节序列:将这些状态转换为字节序列,通常是通过某种编码方式。
1.1.2反序列化
反序列化是序列化的逆过程,即将字节序列恢复为对象的过程。在反序列化过程中,字节序列被重新构造为原来的对象,恢复其状态。
目的:
- 恢复对象状态:从文件、数据库或网络中读取字节序列,并将其转换回对象。
- 数据共享:在分布式系统中,接收方可以通过反序列化接收到的数据来恢复对象的状态。
过程:
- 读取字节序列:从存储介质或网络中读取字节序列。
- 构造对象:根据字节序列中的信息重新构造对象。
1.2 @JsonSerialize与@JsonDeserialize
@JsonSerialize
和 @JsonDeserialize
是 Jackson 库提供的注解,用于在序列化(将对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为对象)过程中对特定字段进行自定义处理。这些注解允许你控制 JSON 数据的格式和内容,而不需要改变对象本身的数据结构。
1.2.1@JsonSerialize
@JsonSerialize
注解用于指定一个自定义的序列化器,该序列化器用于将 Java 对象转换成 JSON 字符串。当你需要在序列化过程中对某些字段进行特殊处理时,可以使用这个注解。
定义与用途:
- 定义:@JsonSerialize注解用于指定在将Java对象序列化为JSON字符串时使用的序列化器。
- 用途:通过该注解,开发者可以自定义序列化过程,如格式化日期、调整数字的小数位数、将枚举类型序列化为特定的字符串等。
使用场景:
- 当Java对象的某个属性需要按照特定的格式或逻辑进行序列化时,可以使用@JsonSerialize注解。
- 例如,将日期时间格式化为“yyyy-MM-dd HH:mm:ss”格式的字符串,或将金额从元转换为万元等。
使用方式:
- 可以将@JsonSerialize注解应用于字段、get方法或类级别。
- 通过using属性指定自定义的序列化器类。指定一个实现了
JsonSerializer
接口的类,用于处理字段的序列化。
例如:SexSerializer是自定义处理性别的序列化器
@Schema(name="sex",description=" 性别 ")@JsonSerialize(using = SexSerializer.class)private Integer sex;
1.2.2@JsonDeserialize
@JsonDeserialize
注解用于指定一个自定义的反序列化器,该反序列化器用于将 JSON 字符串转换成 Java 对象。当你需要在反序列化过程中对某些字段进行特殊处理时,可以使用这个注解。
定义与用途:
- 定义:@JsonDeserialize注解用于指定在将JSON字符串反序列化为Java对象时使用的反序列化器。
- 用途:通过该注解,开发者可以自定义反序列化过程,如将特定格式的字符串转换为日期对象、将JSON中的某个字段映射到Java对象的不同属性等。
使用场景:
- 当JSON数据的格式与Java对象的属性不完全匹配,或者需要按照特定的逻辑将JSON数据转换为Java对象时,可以使用@JsonDeserialize注解。
- 例如,将JSON中的“金额”字段从万元转换为元,或将自定义格式的日期字符串转换为Java的LocalDateTime对象等。
使用方式:
- 可以将@JsonDeserialize注解应用于字段、set方法或类级别。
- 通过using属性指定自定义的反序列化器类。指定一个实现了 JsonDeserializer接口的类,用于处理字段的序列化。
例如:UserAccountDeserializer是自定义处理用户账号的反序列化器
@Schema(name="account",description=" 账号 ")@JsonDeserialize(using= UserAccountDeserializer.class)private String account;
2.场景实现
2.1需求分析
(1)数据库中性别字段为数字,将性别转化为汉字给前端进行展示
(2)保存密码时,进行加密存储,查询时给它明文展示(这里只是举例查所有,真正的场景肯定不能这样搞)
开始分析:
(1)关于性别的转化、密码的明文展示。这俩基本一致,都是查询时给前端进行展示。那你想想,我们给前端进行展示,肯定涉及到了传输。那就是将我们的实体对象,转化成Json字符串的形式,那就是在Vo对象字段上加@JsonSerialize注解实现自定义序列化器来操作。
(2)关于密码的加密保存。那你想想,前端传给我们的肯定是明文,而且是Json串,我们将Json转化成java对象进行保存。那这个不就是反序列话操作吗。我们可以在入参Dto对象字段上加@JsonDeserialize注解实现自定义反序列化器来操作
那这里,可能有个疑问,从数据库中查出来,不也涉及到了,反序列化操作,将数据库对象映射成了java对象?保存时,不也涉及到了序列化操作,将java对象映射成Json串?是的没错,但是我这里用了mybatis-plus来实现,我查询了一下,mybatis-plus自带的crud他好像不一定会实现序列化与反序列化,就对导致我们的注解失效,所以这里我没在数据库entity实体上加@JsonSerialize和@JsonDeserialize注解)也有另一种实现方法,使用mybatis-plus支持的typeHandler的形式(typeHandler我在另一篇文章里去写)
2.2通用部分
2.2.1 Entity数据库实体,User对象
package com.zsh.test.swagger3test.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zsh.test.swagger3test.handler.Sm4TypeHandler;
import lombok.Data;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;import java.io.Serializable;
import java.util.Date;/*** @Description * @Author ZhaoShuhao* @Date: 2024-07-21 12:45:39*/@Data
@Accessors(chain = true)
@Schema(name="用户信息")
@TableName(value = "user",autoResultMap = true)
public class User implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id",type = IdType.ASSIGN_ID)@Schema(name="id",description=" 主键 ")private Long id;@TableField(value = "name")@Schema(name="name",description=" 姓名 ")private String name;@TableField(value = "age")@Schema(name="age",description=" 年龄 ")private Integer age;@TableField(value = "phone")@Schema(name="phone",description=" 电话 ")private String phone;// @TableField(value = "account",typeHandler = Sm4TypeHandler.class)@Schema(name="account",description=" 账号 ")private String account;// @TableField(value = "pwd",typeHandler = Sm4TypeHandler.class)@Schema(name="pwd",description=" 密码 ")private String pwd;@TableField(value = "sex")@Schema(name="sex",description=" 性别 ")private Integer sex;@TableField(value = "creat_time")@Schema(name="reatTime",description=" 创建时间 ")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date creatTime;@TableField(value = "update_time")@Schema(name="updateTime",description=" 更新时间 ")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date updateTime;}
2.2.2 Vo实体,UserVo视图对象
package com.zsh.test.swagger3test.model.vo;import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.zsh.test.swagger3test.serializer.SexSerializer;
import com.zsh.test.swagger3test.serializer.UserPwdSerializertest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;/*** @Description * @Author ZhaoShuhao* @Date: 2024-07-21 12:45:39*/@Data
@Accessors(chain = true)
@Schema(name=" user ", description=" null ")
public class UserVo implements Serializable {private static final long serialVersionUID = 1L;@Schema(name="id",description=" 主键 ")private Long id;@Schema(name="name",description=" 姓名 ")private String name;@Schema(name="age",description=" 年龄 ")private Integer age;@Schema(name="phone",description=" 电话 ")private String phone;@Schema(name="account",description=" 账号 ")private String account;@Schema(name="pwd",description=" 密码 ")@JsonSerialize(using= UserPwdSerializertest.class)private String pwd;@Schema(name="sex",description=" 性别 ")@JsonSerialize(using = SexSerializer.class)private Integer sex;
}
2.2.3 Dto实体,UserDto入参对象
package com.zsh.test.swagger3test.model.dto;import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.zsh.test.swagger3test.serializer.UserPwdDeSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.io.Serializable;/*** @Description * @Author ZhaoShuhao* @Date: 2024-07-21 12:45:39*/@Data
public class UserDto implements Serializable {private static final long serialVersionUID = 1L;@Schema(name="name",description=" 姓名 ")private String name;@Schema(name="age",description=" 年龄 ")private Integer age;@Schema(name="phone",description=" 电话 ")private String phone;@Schema(name="account",description=" 账号 ")private String account;@JsonDeserialize(using= UserPwdDeSerializer.class)@Schema(name="pwd",description=" 密码 ")private String pwd;@Schema(name="sex",description=" 性别 ")private Integer sex;
}
2.2.4 UserMapper
package com.zsh.test.swagger3test.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsh.test.swagger3test.model.entity.User;
import org.apache.ibatis.annotations.Mapper;/**
* @author KeepHappy
* @description 针对表【user】的数据库操作Mapper
* @createDate 2024-07-21 12:55:52
* @Entity src/main/java/com/zsh/test/swagger3test.model.User
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {}
2.2.5 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsh.test.swagger3test.mapper.UserMapper"></mapper>
2.2.6 UserService
package com.zsh.test.swagger3test.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;import java.util.List;/**
* @author KeepHappy
* @description 针对表【user】的数据库操作Service
* @createDate 2024-07-21 12:55:52
*/
public interface UserService extends IService<User> {}
2.2.7 UserServiceImpl
package com.zsh.test.swagger3test.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.mapper.UserMapper;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;
import com.zsh.test.swagger3test.service.UserService;
import io.swagger.v3.core.util.Json;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;/**
* @author KeepHappy
* @description 针对表【user】的数据库操作Service实现
* @createDate 2024-07-21 12:55:52
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}
2.3@JsonDeserialize的使用
UserDto入参对象:
@JsonDeserialize(using= UserPwdDeSerializer.class)
@Schema(name="pwd",description=" 密码 ")
private String pwd;
2.3.1 UserPwdDeSerializer密码加密反序列化器
package com.zsh.test.swagger3test.serializer;import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;/*** 反序列化 对用户字段进去加密*/
public class UserPwdDeSerializer extends JsonDeserializer<String> {private static final Logger logger = LoggerFactory.getLogger(UserPwdDeSerializer.class);private static final String hexKey ="79C37CDBCD6FAB9D0619F511B2031234";@Overridepublic String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {String text = jsonParser.getText();String enPwd = StrUtil.isBlank(text) ? "" : getEncryptInfo(text);return enPwd;}public static String getEncryptInfo(String value) {return getEncryptInfoSm4(value);}private static String getEncryptInfoSm4(String value){SM4 sm4 = new SM4(Mode.ECB, Padding.PKCS5Padding,ByteUtils.fromHexString(hexKey));return sm4.encryptHex(value);}}
2.3.2 UserController用户接口
package com.zsh.test.swagger3test.controller;import cn.hutool.core.bean.BeanUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsh.test.swagger3test.config.Result;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;
import com.zsh.test.swagger3test.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** @author ZhaoShuhao* @data 2024/7/21 15:12*/
@Tag(name = "用户接口")
@RestController
@RequestMapping("/user/api")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/save")@Operation( summary= "添加用户信息")public Result saveUserInfo(@RequestBody List<UserDto> userList) {List<User> users = BeanUtil.copyToList(userList, User.class);boolean b = userService.saveBatch(users);return b ? Result.success() : Result.error("添加失败");}}
2.3.3 结果展示
2.4@JsonSerialize的使用
UserVo视图对象:
@Schema(name="pwd",description=" 密码 ")
@JsonSerialize(using= UserPwdSerializertest.class)
private String pwd;
@Schema(name="sex",description=" 性别 ")
@JsonSerialize(using = SexSerializer.class)
private Integer sex;
2.4.1SexSerializer性别转化序列化器
package com.zsh.test.swagger3test.serializer;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;import java.io.IOException;/**序列化* @author ZhaoShuhao* @data 2024/7/25 23:30*/
public class SexSerializer extends JsonSerializer<Integer> {@Overridepublic void serialize(Integer integer, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (integer == 1) {jsonGenerator.writeString("男");} else if (integer == 2) {jsonGenerator.writeString("女");}else {jsonGenerator.writeString("未知");}}
}
2.4.2 UserPwdSerializertest密码解密序列化器
package com.zsh.test.swagger3test.serializer;import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** 序列化 对用户字段进去解密*/
public class UserPwdSerializertest extends JsonSerializer<String> {private static final Logger logger = LoggerFactory.getLogger(UserPwdSerializertest.class);private static final String hexKey ="79C37CDBCD6FAB9D0619F511B2031234";@Overridepublic void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {String dePwd = StrUtil.isBlank(s) ? "" : deserializeText(s);jsonGenerator.writeString(dePwd);}public static String deserializeText(String text){return getDecryptInfoSm4(text) ;}private static String getDecryptInfoSm4(String value){try {SM4 sm4 = new SM4(Mode.ECB, Padding.PKCS5Padding,ByteUtils.fromHexString(hexKey));return sm4.decryptStr(value, StandardCharsets.UTF_8);}catch (Exception e){logger.error("解密数据{}",value);return value;}}}
2.4.5 UserController用户接口
package com.zsh.test.swagger3test.controller;import cn.hutool.core.bean.BeanUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsh.test.swagger3test.config.Result;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;
import com.zsh.test.swagger3test.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** @author ZhaoShuhao* @data 2024/7/21 15:12*/
@Tag(name = "用户接口")
@RestController
@RequestMapping("/user/api")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/save")@Operation( summary= "添加用户信息")public Result saveUserInfo(@RequestBody List<UserDto> userList) {List<User> users = BeanUtil.copyToList(userList, User.class);boolean b = userService.saveBatch(users);return b ? Result.success() : Result.error("添加失败");}@PostMapping("/getAllUserInfo")@Operation(summary = "查询所有用户信息")public Result<List<UserVo>> getAllUserInfo(){List<User> list = userService.list();List<UserVo> userVos = BeanUtil.copyToList(list, UserVo.class);return Result.success((userVos));}
}
2.4.3 结果展示
相关文章:
关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)
注:另一种方式参考 关于TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前,我们可以先了解一下什么是序列化与反序列…...
第二届世界科学智能大赛逻辑推理赛道:复杂推理能力评估 #大模型技术之逻辑推理方向 #Datawhale #夏令营 <二>
第二届世界科学智能大赛逻辑推理赛道:复杂推理能力评估 #大模型技术之逻辑推理方向 #Datawhale #夏令营-CSDN博客 这里在上一篇的基础上,已经充分理解了一遍baseline的流程,并修复了一些后处理的问题,包括答案抽取,中间…...
C# 关于Linq延迟查询
demo: int Count 0;string[] obj { "item1", "item2", "item3", "item4", "item5", "item6" };var query obj.Where(item > IsTrue(item));// 第一次遍历foreach (var item in query){Console.WriteLine(it…...
Navicat For Mysql连接Mysql8.0报错:客户端不支持服务器请求的身份验证协议
windows通过navicat连接本地mysql时报错:Client does not support authentication protocol requested by server; consider upgrading MySQL client 一、问题原因二、解决方法1--失败1. 连接mysql客户端2. 修改加密方式3.正确的解决方法1.查找my.ini文件2.修改my.ini文件3.重…...
以西门子winCC为代表的组态界面,还是有很大提升空间的。
组态界面向来都是功能为主,美观和体验性为辅的,这也导致了国内的一些跟随者如法炮制,而且很多操作的工程师也是认可这重模式,不过现在一些新的组态软件可是支持精美的定制化界面,还有3D交互效果,这就是确实…...
HomeServer平台选择,介绍常用功能
平台选择 HomeServer 的性能要求不高,以下是我的硬件参数,可供参考: 硬件: 平台:旧笔记本CPU:i5 4210u内存 8G硬盘:128G 固态做系统盘,1T1T 机械盘组 RAID1 做存储。硬…...
记录一个k8s集群zookeeper部署过程
由于网管中心交维要求必须是支持高可用配置,原先单节点的zookeeper不被允许。所以在k8s集群中做了一个高可用版本的zookeeper。 期间有点小波折,官方给的镜像版本太老,业务不支持,所以手动做了下处理,重新打了一个镜像…...
TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设
随着国家对自主可控的日益重视,目前在各个行业和区域中面临越来越多的国产化,采用有自主知识产权的国产数据库正在成为主流。长期以来,作为拥有纯国产自研背景的 TapData,自是非常重视对于更多国产信创数据库的数据连接器支持&…...
开始写人工智能
文章目录 概述 概述 开始写人工智能模块。既然决定开始写这些,那就开始吧!...
盘点.软件测试模型
软件开发模型 软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段。 软件开发模型能清晰、直观地表达软件开发全过程,明确规定了要完成的主要活动…...
燃气安全无小事,一双专业劳保鞋让你步步安心!
燃气作为我们日常生活中不可或缺的能源之一,为我们的生活提供了极大便利,其安全性往往被忽视在忙碌的日常生活背后。然而,燃气事故一旦发生,后果往往不堪设想,轻则财产损失,重则危及生命。因此,…...
springboot校园服装租赁系统-计算机毕业设计源码30824
目 录 摘要 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 校园服装租赁系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例…...
线性回归和逻辑回归揭示数据的隐藏模式:理论与实践全解析
机器学习之线性回归和逻辑回归 1. 简介1.1 机器学习概述1.2 监督学习的定义与重要性1.3 线性回归和逻辑回归在监督学习中的作用1.3.1 线性回归1.3.2 逻辑回归 2. 线性回归(Linear Regression)2.1 定义与目标2.1.1 回归问题的定义2.1.2 预测连续目标变量 …...
掌握采购询价软件:高效比较供应商报价的技巧
在企业运营中,获取所需的产品往往是一项复杂且耗时的任务,这涉及多个环节和流程。然而,借助电子采购询价(RFQ)系统,许多原本需要采购员手动完成的任务可以自动化运行,从而提高了效率。 那么问题…...
AMQP-核心概念-终章
本文参考以下链接摘录翻译: https://www.rabbitmq.com/tutorials/amqp-concepts 连接(Connections) AMQP 0-9-1连接通常是长期保持的。AMQP 0-9-1是一个应用级别的协议,它使用TCP来实现可靠传输。连接使用认证且可以使用TLS保护…...
在WPF中使用WebView2详解
Microsoft Edge WebView2 Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。 使用 WebView2 可以在本机应用的不同部分嵌入 Web 代码&…...
僵尸进程的例子
以下是一个简单的C语言程序示例,该程序将创建一个子进程,然后子进程退出,但是父进程不会调用wait()或waitpid()来回收子进程的状态,从而使得子进程成为僵尸进程。 #include <stdio.h> #include <stdlib.h> #include …...
消息中间件分享
消息中间件分享 1 为什么使用消息队列2 消息队列有什么缺点3 如何保证消息队列的高可用4 如何处理消息丢失的问题?5 如何保证消息的顺序性1 为什么使用消息队列 解耦、异步、削峰 解耦 不使用中间件的场景 使用中间件的场景 异步 不使用中间件 使用中间件 削峰 不使…...
12. kubernetes调度——污点Taint和容忍Toleration
kubernetes调度——污点Taint和容忍Toleration 一、通过节点属性调度1、节点名称2、节点标签2.1 查看节点标签2.2 添加标签2.3 修改标签2.4 删除标签2.5 通过节点标签进行调度 二、污点Taint和容忍Toleration1、污点Taint1.1 查看Master节点的污点1.2 添加污点1.3 删除污点 2、…...
第100+18步 ChatGPT学习:R实现SVM分类
基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。 答曰:可!用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了,就帮各位搬运一下吧。 二、R代码实现SVM分类 (1&a…...
react函数学习——useState函数
在 React 中,useState 是一个钩子(hook),用于在函数组件中添加状态管理功能。它返回一个数组,包含两个元素: 当前状态值(selectedValue):这是状态的当前值。更新状态的函…...
方天云智慧平台系统 GetCompanyItem SQL注入漏洞复现
0x01 产品简介 方天云智慧平台系统,作为方天科技公司的重要产品,是一款面向企业全流程的业务管理功能平台,集成了ERP(企业资源规划)、MES(车间执行系统)、APS(先进规划与排程)、PLM(产品生命周期)、CRM(客户关系管理)等多种功能模块,旨在通过云端服务为企业提供…...
C语言同时在一行声明指针和整型变量
如果这么写, int *f, g; 并没有声明2个指针,编译器自己会识别,f是一个指针,g是一个整型变量; void CTszbView::OnDraw(CDC* pDC) {CTszbDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for nat…...
thinkphp框架远程代码执行
一、环境 vulfocus网上自行下载 启动命令: docker run -d --privileged -p 8081:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP192.168.131.144 8e55f85571c8 一定添加--privileged不然只能拉取环境首页不显示 二、thinkphp远程代码执行 首页&a…...
【公式】博弈论中的核心算法:纳什均衡公式解析
博弈论中的核心算法:纳什均衡公式解析 纳什均衡的基本概念 纳什均衡是博弈论中的一个核心概念,它描述了一个博弈中所有参与者都无法通过单方面改变自己的策略来增加收益的状态。在纳什均衡状态下,每个参与者的策略都是对其他参与者策略的最优反应。纳什均衡的公式可以表示…...
计算机网络面试题2
WebSocket相关知识 什么是WebSocket? WebSocket是一种基于TCP连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据 WebSocket和HTTP有什么区别? 1.WebSocket是双向通信协议,HTTP是单向通信协议 2.WebSocket使用ws://或者wss:/…...
Linux网络——深入理解传入层协议TCP
目录 一、前导知识 1.1 TCP协议段格式 1.2 TCP全双工本质 二、三次握手 2.1 标记位 2.2 三次握手 2.3 捎带应答 2.4 标记位 RST 三、四次挥手 3.1 标记位 FIN 四、确认应答(ACK)机制 五、超时重传机制 六 TCP 流量控制 6.1 16位窗口大小 6.2 标记位 PSH 6.3 标记…...
快速搞定分布式RabbitMQ---RabbitMQ进阶与实战
本篇内容是本人精心整理;主要讲述RabbitMQ的核心特性;RabbitMQ的环境搭建与控制台的详解;RabbitMQ的核心API;RabbitMQ的高级特性;RabbitMQ集群的搭建;还会做RabbitMQ和Springboot的整合;内容会比较多&#…...
5万字长文吃透快手大数据面试题及参考答案(持续更新)
目录 Flink为什么用aggregate()不用process() 为什么使用aggregate() 为什么不用process() 自定义UDF, UDTF实现步骤,有哪些方法?UDTF中的ObjectInspector了解吗? 自定义UDF实现步骤 自定义UDTF实现步骤 UDTF中的ObjectInspector Spark Streaming和Flink的区别 Flu…...
WordPress原创插件:启用关闭经典编辑器和小工具
WordPress原创插件:启用关闭经典编辑器和小工具 主要功能 如图所示,用于启用或禁用经典编辑器和经典小工具,以替代Gutenberg编辑器。 插件下载 https://download.csdn.net/download/huayula/89592822...
萝卜快跑:自动驾驶的先锋与挑战
萝卜快跑:自动驾驶的先锋与挑战 萝卜快跑作为自动驾驶领域的重要参与者,被视为自动驾驶的先锋。它代表了自动驾驶技术在实际应用中的重要突破,为人们的出行方式带来了革新。萝卜快跑的发展展示了自动驾驶技术的巨大潜力,如提高交通…...
得到xml所有label 名字和数量 get_xml_lab.py,get_json_lab.py
import os import xml.etree.ElementTree as ETrootdir2 r"F:\images3\xmls" file_list os.listdir(rootdir2) # 列出文件夹下所有的目录与文件# 初始化字典 classes_dict {}for file_name in file_list:path os.path.join(rootdir2, file_name)if os.path.isfi…...
数据结构算法-排序(二)
插入排序 插入排序核心 假设数组中的一部数据已经排好序,要插入的数据和这些数据进行比较,直到找到合适的位置插入新数据。 插入排序步骤 插入排序主要有以下步骤构成: 假设有序,我们假设**a[0]**已经排好序待插入的数据为a[j]…...
Linux安装与配置
下载VMware 首先我们需要下载一个叫VMware的软件: 进入官方下载,地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【 输入许可证密钥 MC60H-DWHD5-H80U9-6V85…...
AI赋能交通治理:非机动车监测识别技术在城市街道安全管理中的应用
引言 城市交通的顺畅与安全是城市管理的重要组成部分。非机动车如自行车、电动车、摩托车等在城市交通中扮演着重要角色,但同时也带来了管理上的挑战。尤其是在机动车道上误入非机动车的现象,不仅影响交通秩序,还可能引发交通事故。思通数科…...
水电站泄洪放水预警广播系统解决方案
一、背景 在现代水利工程管理中,水电站泄洪放水预警广播系统扮演着至关重要的角色。这一系统不仅关系到水电站的安全运行,也直接关系到下游地区人民群众的生命财产安全。因此,设计一套完善、高效、可靠的泄洪放水预警广播系统显得尤为必要。…...
【Django】ajax和django接口交互(获取新密码)
文章目录 一、需求1. 效果图 二、实验1. 写get接口后端2. 写html后端3. 写前端4. 测试 一、需求 1. 效果图 二、实验 1. 写get接口后端 写views import string import random def getnewpwd(request):words list(string.ascii_lowercasestring.ascii_uppercasestring.digi…...
Logback 日志打印导致程序崩溃的实战分析
在软件开发和运维中,日志记录是必不可少的一环,帮我们追踪程序的行为,定位问题所在。然而,有时日志本身却可能成为问题的根源。本文将通过一个真实的案例来探讨 Logback 日志系统中的一个常见问题,当并发量大ÿ…...
新加坡 Numen Cyber 与香港光环云数据有限公司达成战略合作
新加坡本土网络安全公司 Numen Cyber 宣布与香港光环云数据有限公司(简称“光环云香港”)建立战略合作伙伴关系。此次合作将重点放在云服务器和云服务业务场景的安全领域。 Numen Cyber,作为一家致力于为客户提供专业网络安全服务和一体化安…...
Laravel魔术方法:框架的隐秘力量
Laravel魔术方法:框架的隐秘力量 引言 Laravel是一个充满魔力的PHP框架,它通过许多巧妙的设计让Web开发变得简洁而优雅。在Laravel中,魔术方法(Magic Methods)是这些魔力的体现之一。魔术方法是PHP预定义的、可以在类…...
系统复习Java日志体系
一,我们采用硬编码体验一下几个使用比较多的日志 分别导入几种日志的 jar 包 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…...
网络管理linux命令
在Linux系统中,有许多常用的网络命令用于检查网络配置、诊断网络问题以及管理网络连接。以下是一些常用的网络命令及其简要说明: ifconfig 显示或配置网络接口。 ifconfigip 用于显示和操作路由、设备、策略路由和隧道。 ip addr show ip link show ip …...
PowerDNS架构解析与安装部署指南
1、背景介绍 目前公司使用PowerDNS进行DNS管理,但由于采用的是单节点架构,存在不可用的风险。为提升系统的稳定性和可靠性,我们计划对现有架构进行重构。通过引入高可用性设计,我们将优化系统架构,使其能够在故障情况…...
Ubuntu 20.04.6 安装 Elasticsearch
1.准备 -- 系统更新 sudo apt update sudo apt upgrade -- 安装vim 文本编辑器 sudo apt install vim-- jdk 版本确认 java -versionjdk 安装可以参照:https://blog.csdn.net/CsethCRM/article/details/140768670 2.官方下载Elasticsearch 官方地址:h…...
Python for循环迭代原理(迭代器 Iterator)
在使用Python时,我们经常会使用for循环来访问容器对象(列表、字符、字典等)中的元素。其幕后实际是通过迭代协议来完成的,迭代是一种依次访问对象中元素的方式,for循环在对象上调用iter()函数生成一个迭代器࿰…...
通信原理-思科实验四:静态路由项配置实验
实验四 静态路由项配置实验 一:实验内容 二:实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口,为路由器R1和R3增加快速以太网接口模块NM-1FE-TX,安装后检查路由器的接…...
ngzero使用外部的svg图标
1.将图标svg下下来,放到项目中,路径如下所示 之后 <span nz-icon [nzIconfont]“‘icon-zhibiao’”>使用 2.直接使用阿里的图标 先将你要用的图标放入购物车,再将购物车的图标添加到你主页的我的项目中 之后代码中在startupService…...
逆矩阵、秩
在数学的广阔天地中,线性代数扮演着至关重要的角色。它不仅是现代科学和工程学的基石,也是理解复杂数据结构的关键。本文将深入探讨线性代数中的几个核心概念:逆矩阵、秩、列空间和零空间,通过详细的解释和丰富的实例,…...
pc端小程序抓包修改数据相关记录
看了很多关于小程序抓包的 废话不多说直接演示 一、小程序抓包 1.所需要的工具 官网下载即可: https://www.charlesproxy.com/latest-release/download.do 我这里用的 Charles-proxy-4.6.6-win64 需要中文破解参考 https://www.jianshu.com/p/4d67dbbf2f6a 2、破…...
用Python打造精彩动画与视频.2.1 Python基础语法概述
2.1 Python基础语法概述 Python作为一门功能强大且易于学习的编程语言,其基础语法简单直观,非常适合初学者入门。这一节将带你了解Python的基本语法规则,为后续制作动画和视频打下坚实的基础。 1. 变量与数据类型 Python的变量不需要提前声…...