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

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

时间:2024-01-21 19:12:04浏览次数:39  
标签: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是秘钥
  • 不只是String字段,实体类字段也可以,他会将其转为JSON字符串后加密。而在请求接口传入参数时传加密的字符串即可。
@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://www.cnblogs.com/gltqe/p/17978181

相关文章

  • SpringBoot集成MybatisPlus
    1、添加依赖<!--mybatis-plus启动器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!--mybatis-plus代码生成器--><depe......
  • 在 SpringBoot 项目中使用 MDC 实现日志 traceId 的统一
    前言在项目中,对于每一次请求,我们都需要一个traceId将整个请求链路串联起来,这样就会很方便我们根据日志排查问题。但是如果每次打印日志都需要手动传递traceId参数,也会很麻烦,MDC就是为了解决这个场景而使用的。注:这里我们使用slf4j+logbacklogback配置logback.xml......
  • RabbitMQ学习五 springboot连接RabbitMQ
    一、入门引入依赖在springboot中引入spring-amqp-starter<!--amqp的起步依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId></dependency>编写配置文件spring:rabbitmq......
  • 面试官:SpringBoot如何实现缓存预热?
    缓存预热是指在SpringBoot项目启动时,预先将数据加载到缓存系统(如Redis)中的一种机制。那么问题来了,在SpringBoot项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢?实现方案概述在SpringBoot启动之后,可以通过以下手段实现缓存预热:使用启动监听事件实现缓存预热。使......
  • springboot多模块项目(微服务项目)正确打包(jar)方式
    大致步骤新建一个springboot项目名称为父亲添加父快捷方式。新建子模块,子模块同时插入新建springboot的项目,依次创建enty和web模块(关键是并配置好pom文件)web模块依赖于entiy模块中的实体类,创建测试控制器,先测试项目没问题再开始打包(jar)开始打包测试jar是否有用创建项目注意点:子模......
  • springBoot项目正确认识打war包方式(含打包代码链接)
    一:新建一个普普通通的springBoot项目二:并且编写测试controller@RequestMapping@RestControllerpublicclassController{@RequestMapping("/zzh")publicStringtoString(){return"zzh666";}}三:改造启动类(重点)主要就是继承SpringBootServletInitiali......
  • springboot整合springSecurity入门案例(实现登录,记住我等常用标签使用)
    一,整合进依赖每个依赖都标了注释,大家可以按照自己需要的来添加,置于配置问件啥的,大家可以参考springboot+mybatisplus+redis整合(附上脚手架完整代码)<!--主要就是加了这个依赖--><dependency><groupId>org.springframework.security</groupId><artifact......
  • springboot+mybatis-plus+redis整合(附上脚手架完整代码)
    首先新建一个springboot项目next到这里的时候,我们可以选择用jdk几,还有就是Group,这个一般就是com.公司名字了,artifact就是项目名字。个人开发我还是喜欢用com.名字前缀哈。到了这一步的话,如果对这个项目有什么别的需求,比如需要用到mybatis啥的可以勾相应的选项。其实就是idea自动帮......
  • springboot项目结合filter,jdk代理实现敏感词过滤(简单版)
    我们对getParameter()这个方法得到的参数进行敏感词过滤。实现思路:利用过滤器拦截所有的路径请求同时在在过滤器执行的时候对getParameter得到的value值进行过滤。最后呢,到我们自己的实现的逻辑中呢?这个value值就被我们做过处理了。1:自定义的过滤配置文件把文件位置放在resource下的......
  • 正确理解springboot国际化简易运行流程
    看源码可以看出–》大致原理localeResolver国际化视图(默认的就是根据请求头带来的区域信息获取Locale进行国际化)返回的本地解析是根据响应头来决定的)接着按住ctrl点localeresolver可知localeresolver是一个接口于是有了这些我们只需通过继承LocaleResolver来自定义我们自己的Loca......