首页 > 其他分享 >SpringBoot项目通过注解快速解决,字典翻译,响应数据加密,数据脱敏等问题

SpringBoot项目通过注解快速解决,字典翻译,响应数据加密,数据脱敏等问题

时间:2024-01-20 14:31:55浏览次数:31  
标签:return SpringBoot student 加密 dictCode type public 脱敏 String

简介

在几乎所有SpringBoot项目中都会面临字典翻译接口数据加密数据脱敏的问题。在每个接口中单独的解决会非常繁琐,因此接下来介绍一下怎么通过注解快速解决这些问题。

实现步骤

1.引入maven坐标

<dependency>
            <groupId>io.gitee.gltqe</groupId>
            <artifactId>common-annotation</artifactId>
            <version>1.0.0</version>
        </dependency>

2.实现处理器接口

  • 因为每个项目的处理方式不同(比如字典翻译可以是在项目中直接写死,也可以根据dictCodeRedisMongoDB中查找),所以这一步是必须的。
  • 注意:我以字典翻译为例,实现了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

标签:return,SpringBoot,student,加密,dictCode,type,public,脱敏,String
From: https://blog.51cto.com/u_16085354/9345611

相关文章

  • Java21 + SpringBoot3集成WebSocket
    目录前言相关技术简介什么是WebSocketWebSocket的原理WebSocket与HTTP协议的关系WebSocket优点WebSocket应用场景实现方式添加maven依赖添加WebSocket配置类,定义ServerEndpointExporterBean定义WebSocketEndpoint前端创建WebSocket对象总结前言近日心血来潮想做一个开源项目,目......
  • MySQL中的加密函数
    本文简单介绍MySQL中的加密函数。MySQL提供了多种加密函数,以下是一些常用的:PASSWORD(str):用于密码加密,通常用于创建用户时对密码进行加密。MD5(str):生成一个128位的加密串,返回一个32位的16进制数。SHA1(str):生成一个160位的加密串,返回一个40位的16进制数。ENCODE(str......
  • SpringBoot引入SpEL,优雅控制复杂权限!
    对于在Springboot中,利用自定义注解+切面来实现接口权限的控制这个大家应该都很熟悉,整体来说思路如下:自定义一个权限校验的注解,包含参数value配置在对应的接口上定义一个切面类,指定切点在切入的方法体里写上权限判断的逻辑然而,在实际的开发中,对于权限校验的需求场景是很多的,比如:傻眼......
  • Jmeter前置处理器之beanshell处理加密
    一前言环境:Jmeter5.3window10利用beanshell在前置处理器中加密接口用到的数据,在接口请求之前加密数据例子还是用之前的例子,稍微改造下,加一个beanshell的前置处理器运行-查看结果树,httpbin接口会在响应数据中显示接口请求的数据,看下请求的密码是否加密如上,接口请求......
  • JAVA实现RSA加密、解密、加签、验签
    1、工具类RSAUtils.javaimportjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.io.ByteArrayOutputStream;importjavax.crypto.Cipher;importjava.security.*;importjava.util.*;publicclassRSAUtils{/......
  • springboot项目中的一些小tips
    1.服务出现类不是java,左下角是红色"J"解决方式:选择java包右键,MarkDirectoryas=>SourcesRoot2.myBatisX插件推荐方便mapper和xml之间的对应,还可以生成代码,推荐文章:初步使用:https://blog.csdn.net/weixin_47025166/article/details/125362323进阶使用:https://baomidou.c......
  • SpringBoot使用Feign进行服务间通信
    一、前言在分布式系统中,服务间通信是非常常见的情况。Feign是一个开源的JavaHTTP客户端,可以帮助我们在SpringBoot应用中快速构建和使用HTTP客户端,方便实现服务间的通信。与其他HTTP客户端相比,Feign具有简化HTTPAPI定义、支持多种HTTP请求方法、支持请求和响应的压缩、支持请求和......
  • SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换
    场景SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135653227上面实现通过注解和配置文件的方式去进行多数据源操作。如果业务需求,比如查询第三方接口时提供的是sqlserver的视图连......
  • SpringBoot集成邮件服务进行校验
    一、前言在我们进行注册、登录等操作的时候,为了保证用户信息的安全性,我们经常会需要接收短信验证码等场景,虽然它的安全系数较高,但是由于需要付费使用,所以我们也可以使用邮箱服务接收验证码来实现安全校验,提升系统安全系数。二、环境准备以QQ邮箱为例,我们需要在邮箱中开启SMTP服务获......
  • RSA加密算法实现
    一、实验目的深度理解RSA算法的工作原理,查阅欧几里得扩展算法计算模运算的逆元,并编程序实现。学会生成不同大小的素数,体会模指数运算的困难性和模指数运算的快速算法。二、实验器材pycharm+python3.11三、实验内容1.实验要求:自己配置python环境,编写RSA算法实现程序,运行RSA程......