关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)

注:另一种方式参考

关于@TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)icon-default.png?t=N7T8http://t.csdnimg.cn/NZy4G

1.简介

1.1 序列化与反序列化

        学习注解之前,我们可以先了解一下什么是序列化与反序列化?

1.1.1序列化

        序列化是将对象的状态信息转换为可以存储或传输的形式的过程。通常,对象会被转换为字节序列,这样它们就可以被写入文件、存储在数据库中,或者通过网络发送给其他计算机。

目的

  1. 持久化:将对象的状态保存到文件或数据库中,以便在程序下次运行时可以恢复对象的状态。
  2. 网络传输:通过将对象转换为字节序列,可以在网络上传输对象的状态,使得分布式系统中的不同部分可以共享数据。

过程

  • 确定对象的状态:选择需要保存的属性或字段。
  • 转换为字节序列:将这些状态转换为字节序列,通常是通过某种编码方式。

1.1.2反序列化

        反序列化是序列化的逆过程,即将字节序列恢复为对象的过程。在反序列化过程中,字节序列被重新构造为原来的对象,恢复其状态。

目的

  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 结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386277.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

115. 不同的子序列 dp入门(一)详细推导dp转移方程式

目录 1. 题目引入&#xff1a; 2. 动态规划解法 2.1 动态dp表示 2.2 动态方程推导: 2.3 具体分析 2.4 初始化 3. 代码如下 java版 c版 Python版 1. 题目引入&#xff1a; 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果…

计算机基础(day1)

1.什么是内存泄漏&#xff1f;什么是内存溢出&#xff1f;二者有什么区别&#xff1f; 2.了解的操作系统有哪些&#xff1f; Windows&#xff0c;Unix&#xff0c;Linux&#xff0c;Mac 3. 什么是局域网&#xff0c;广域网&#xff1f; 4.10M 兆宽带是什么意思&#xff1f;理论…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的&#xff0c;因此你可以根据需要测量的距离&#xff0c;自定义深度相机安装基线&#xff0c;并根据你的项目要求&#xff08;分辨率、快门类型、FPS、光学元件&#xff…

项目风险管理:从理论到实践的探索

项目风险管理&#xff1a;从理论到实践的探索 前言一、项目风险识别二、项目风险应对策略三、综合应对策略结语 前言 在当今快速变化的商业环境中&#xff0c;项目管理已成为组织实现目标的关键工具。然而&#xff0c;项目的成功往往伴随着各种不确定性和潜在风险。有效的风险管…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

五、Spring Boot - 上手篇(1)

&#x1f33b;&#x1f33b;目录 一、快速入门&#xff1a;创建第一个SpringBoot 工程1.1 点击File--->New--->Project...1.2 选择版本和依赖的相关骨架包1.3 设置项目保存目录1.4 项目创建完成&#xff0c;工程主界面如下1.5 项目说明1.6 启动项目1.7 编写 HelloControl…

快速上手,spring boot3整合task实现定时任务

在已经上线的项目中&#xff0c;定时任务是必不可少的。基于spring boot自动装配的原理&#xff0c;我们要集成task定时任务还是非常简单的。只需要简单的两步就可以实现。 1、创建一个spring boot项目&#xff0c;并在项目的启动类&#xff08;也不一定非要是启动类&#xff…

如何排查GD32 MCU复位是由哪个复位源导致的?

上期为大家讲解了GD32 MCU复位包括电源复位和系统复位&#xff0c;其中系统复位还包括独立看门狗复位、内核软复位、窗口看门狗复位等&#xff0c;在一个GD32系统中&#xff0c;如果莫名其妙产生了MCU复位&#xff0c;如何排查具体是由哪个复位源导致的呢&#xff1f; GD32 MC…

【RabbitMQ】MQ相关概念

一、MQ的基本概念 定义&#xff1a;MQ全称为Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信&#xff0c;而无需建立直接的连接。作用&#xff1a;主要用于分布式系统之间的通信&#x…

vulntarget-b

实际部署之后centos7 的ip有所变动分别是 :192.168.127.130以及10.0.20.30 Centos7 老规矩还是先用fscan扫一下服务和端口&#xff0c;找漏洞打 直接爆出来一个SSH弱口令…&#xff0c;上来就不用打了&#xff0c;什么意思&#xff1f;&#xff1f;&#xff1f; 直接xshell…

STM32--HAL库--定时器篇

一&#xff1a;如何配置定时器 打开对应工程串口配置好的工程&#xff08;上一篇博客&#xff09;做如下配置&#xff1a; 定时器的中断溢出时间计算公式是&#xff1a; 由图得T100*1000/100MHz 注&#xff1a;100MHz100000000 所以溢出时间等于1ms 关于上图4的自动重装…

【网络安全】文件上传黑白名单及数组绕过技巧

不安全的文件上传&#xff08;Unsafe FileUpload&#xff09; 不安全的文件上传是指Web应用程序在处理用户上传的文件时&#xff0c;没有采取足够的安全措施&#xff0c;导致攻击者可能利用这些漏洞上传恶意文件&#xff0c;进而对服务器或用户造成危害。 目录 一、文件上传…

Unity横板动作游戏 - 素材导入和整理

导入素材 编辑器布局 点击每个窗口右上角的三个点可以有更多的窗口选项。 在屏幕的右上角有一个菜单可以保存布局或读取已经报错的布局。 工具按钮 编辑器上的工具按钮在启动的时候是蓝色的&#xff0c;在不启动的时候是灰色的。 这个按钮将会决定场景中的物体是以锚点显示还…

Oracle配置TCPS加密协议测试

文章目录 一、环境信息二、配置过程1.创建证书2.监听配置2.1.配置sqlnet.ora2.2.配置listener.ora文件2.3.配置tnsnames.ora文件2.4.重载监听 3.数据库本地测试3.1. tcps登录测试3.2.日志监控 一、环境信息 操作系统&#xff1a;Linux 版本信息&#xff1a;Oracle 19c 参考文档…

EXCEL自动公式计算始终为0

如果你的数据单元格的左上角存在绿色的三角小箭头&#xff0c;那么就会造成这种问题&#xff1a; 你的数字是以文本形式存入的单元格 解决办法&#xff1a; 选中数据列&#xff0c;数据->分列 直接选择完成 此时就可以进行公式计算了

pytest结合allure-pytest插件生成测试报告

目录 一、安装allure-pytest插件 二、下载allure 三、生成allure报告 四、效果展示 一、安装allure-pytest插件 二、下载allure 下载之后解压&#xff0c;解压之后还要配置环境变量&#xff08;把allure目录下bin目录配置到系统变量的path路径&#xff09;&#xff0c;下…

企业化运维(8)Docker容器技术

###1.Docker介绍### 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间…

2024后端开发面试题总结

一、前言 上一篇离职贴发布之后仿佛登上了热门&#xff0c;就连曾经阿里的师兄都看到了我的分享&#xff0c;这波流量真是受宠若惊&#xff01; 回到正题&#xff0c;文章火之后&#xff0c;一些同学急切想要让我分享一下面试内容&#xff0c;回忆了几个晚上顺便总结一下&#…

全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)

项目概述 随着工业4.0时代的到来&#xff0c;工业物联网&#xff08;IIoT&#xff09;在提高生产效率、降低运营成本和实现智能制造方面得到了广泛应用。本项目旨在开发一个全面的工业物联网监控系统&#xff0c;能够实时监测设备的温度、压力、振动和电流等参数&#xff0c;并…

谷粒商城实战踩坑笔记-Service循环依赖

文章目录 1. 使用 Lazy 注解2. 使用 PostConstruct 注解3&#xff0c;补充循环依赖相关知识循环依赖的原因举例说明 4&#xff0c;Lazy 的工作原理 启动项目失败&#xff0c;原因是出现了循环依赖。 The dependencies of some of the beans in the application context form a …