简介
在几乎所有SpringBoot项目中都会面临字典翻译,接口数据加密,数据脱敏的问题。在每个接口中单独的解决会非常繁琐,因此接下来介绍一下怎么通过注解快速解决这些问题。
实现步骤
1.引入maven坐标
<dependency>
<groupId>io.gitee.gltqe</groupId>
<artifactId>common-annotation</artifactId>
<version>1.0.0</version>
</dependency>
2.实现处理器接口
- 因为每个项目的处理方式不同(比如字典翻译可以是在项目中直接写死,也可以根据
dictCode
在Redis或MongoDB中查找),所以这一步是必须的。 -
注意:我以字典翻译为例,实现了
DictHandle
接口,如果需要接口加解密则实现CipherHandle
接口,如果需要数据脱敏则实现DataMaskHandle
接口或者使用默认的DefaultDataMaskHandle
/**
* 自定义字典处理方式
*
* @author gltqe
* @date 2023/6/18 1:12
*/
@Configuration
public class CustomDictHandle implements DictHandle {
@Resource
private RedisTemplate redisTemplate;
@Override
public Object getDictContent(Dict dict, String value) {
String dictCode = dict.dictCode();
// 模拟返回字典数据 (实际项目中 一般是从redis中查出)
String stuType = "stu_type";
String stuClasses = "stu_classes";
Map<Object, Object> map = new HashMap<>();
if (stuType.equals(dictCode) && "1".equals(value)) {
map.put("label", "类型1");
map.put("value", "1");
}
if (stuClasses.equals(dictCode) && "2".equals(value)) {
map.put("label", "类型2");
map.put("value", "2");
}
// 从redis查出字典
// HashOperations hashOperations = redisTemplate.opsForHash();
// Map map = hashOperations.entries(dictCode);
return map;
}
/**
* 字典翻译字段的后缀 可以不实现 用默认的 _Dict
*
* @author gltqe
* @date 2024/1/12 21:27
* @return: java.lang.String
*/
@Override
public String getSuffix() {
return "_dict_text";
}
}
3.配置JacksonConfig
- 这里需要注入你实现的处理器
@Configuration
public class JacksonConfig implements JacksonCofig {
@Resource
CustomDataMaskHandle customDataMaskHandle;
@Resource
CustomCipherHandle customCipherHandle;
@Resource
CustomDictHandle customDictHandle;
/**
* @author gltqe
* @date 2023/6/14 15:24
**/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return jacksonObjectMapperBuilder -> {
// DataMask 可以使用默认的 DefaultDataMaskHandle
List<Module> modules = getSimpleModule(customDataMaskHandle,
customCipherHandle, customDictHandle);
jacksonObjectMapperBuilder.modules(modules);
};
}
}
测试
1.实体类
@Data
public class Student {
private String id;
private String name;
@Dict(dictMap = "0=女;1=男")
private String sex;
@Dict(dictCode = "stu_type")
private String type;
@Dict(dictCode = "stu_classes")
private String classes;
}
2.controller接口
@RestController
@RequestMapping
public class TestController {
@RequestMapping("/test")
public Result test() {
Student student = new Student();
student.setId("1");
student.setName("张三");
student.setSex("0");
student.setAge(18);
student.setType("1");
student.setClasses("2");
System.out.println("原数据: " + student);
return Result.ok(student);
}
}
3.测试结果
原始数据
Student(id=1, name=张三, sex=0, age=18, type=1, classes=2)
响应数据
{
"code": 200,
"success": true,
"msg": "200",
"data": {
"id": "1",
"name": "张三",
"sex": "0",
"sex_dict_text": "女",
"age": 18,
"type": "1",
"type_dict_text": {
"label": "类型1",
"value": "1"
},
"classes": "2",
"classes_dict_text": {
"label": "一年级一班",
"value": "1"
}
}
}
其他处理器实现
1.加解密
- 我采用了sm4加解密,这里可以使用任意加解密方式,
Constant.SECRET_KEY
是秘钥
@Configuration
public class CustomCipherHandle implements CipherHandle {
/**
* 自定义 实现加密
*
* @param cipher
* @param s
* @author gltqe
* @date 2024/1/12 21:09
* @return: java.lang.Object
*/
@Override
public Object encryptHandle(Cipher cipher, String s) {
try {
s = Sm4Util.encrypt(s, Constant.SECRET_KEY);
} catch (Exception e) {
throw new RuntimeException(e);
}
return s;
}
/**
* 自定义 实现解密
*
* @param cipher
* @param s
* @author gltqe
* @date 2024/1/12 21:10
* @return: java.lang.Object
*/
@Override
public Object decryptHandle(Cipher cipher, String s) {
try {
s = Sm4Util.decrypt(s, Constant.SECRET_KEY);
} catch (Exception e) {
throw new RuntimeException(e);
}
return s;
}
}
2.数据脱敏
- 如果需要自定义可以在注解的
custom
中自定义类型,并在处理器中判断。
@Configuration
public class CustomDataMaskHandle implements DataMaskHandle {
@Override
public Object dataMaskHandle(DataMask dataMask, String fieldValue) {
String custom = dataMask.custom();
String type = "custom_type";
if (type.equals(custom)) {
// 自定义脱敏方式
return "xxx";
} else {
return DefaultDataMaskHandle.defaultMask(dataMask.type(), fieldValue);
}
}
}
注意事项
绝大多数springboot版本(包括但不限于以下版本)都是没有问题的,如果有问题可以留言或参考源码自行修改
- 3.2.1
- 3.0.0
- 2.7.18
- 2.6.0
- 2.5.0
gitee地址:common-annotation
???? ????????如果帮到你了,帮我点个star吧~