首页 > 编程语言 >java通过注解和反射优雅的实现数据脱敏

java通过注解和反射优雅的实现数据脱敏

时间:2023-07-08 19:23:01浏览次数:54  
标签:var7 java String 脱敏 error 注解 public javaBean

  数据脱敏是对分为数据库数据脱敏与接口脱敏。其中数据库入库数据脱敏方式我们一般采用对称加密来实现数据脱敏,接口脱敏我们一般用遮罩方式实现数据脱敏比如用“*”占位。本文章主要介绍接口脱敏方式。

 1.定义一个自定义注解类

import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Desensitized {
    SensitiveTypeEnum type();
    String isEffictiveMethod() default "";
}

2.定义脱敏枚举类

public enum SensitiveTypeEnum {
    CHINESE_NAME,
    ID_CRAD_NUM,
    FIXED_PHONE,
    MOBILE_PHONE,
    CAR_NUMBER,
    ADDRESS,
    EMAIL,
    BANK_CARD,
    PASSWORD;
}

2.定义脱敏工具类

    该工具我们采用反射扫描数据对象实体上的Desensitized注解,通过类型作为一种策略加载不同类型字符串的脱敏Bean来实现数据脱敏 

@Slf4j
public class DesensitizedUtil {

    public static void setNewValueForField(Object javaBean, Field field,Object value) {
        Desensitized annotation = field.getAnnotation(Desensitized.class);
        if (field.getType().equals(String.class) && null != annotation && executeIsEffictiveMethod(javaBean,annotation)) {
            String valueStr = (String) value;
            if (StrUtil.isNotBlank(valueStr)) {
                try {
                    String beanName = lowerLineToHump(annotation.type().toString())+ "Desensitized";
                    AbstractDesensitized desensitized = (AbstractDesensitized) SpringUtil.getBean(beanName);
                    field.set(javaBean,desensitized.handler(javaBean,valueStr));
                } catch (IllegalAccessException var7) {
                    log.error("[core CcbDesitizedUtil executeIsEffictiveMethod IllegalAccessException]:error={}",var7.getMessage(),var7);
                }
            }
        }
    }

    public static Boolean executeIsEffictiveMethod(Object javaBean, Desensitized desensitized) {
        boolean isAnnotationEffictive = true;
        if (desensitized != null) {
            String isEffictiveMethod = desensitized.isEffictiveMethod();
            if (StrUtil.isNotEmpty(isEffictiveMethod)) {
                try {
                    Method method = javaBean.getClass().getMethod(isEffictiveMethod);
                    method.setAccessible(true);
                    isAnnotationEffictive = (Boolean) method.invoke(javaBean);
                } catch (NoSuchMethodException var5) {
                    log.error("[core CcbDesitizedUtil executeIsEffictiveMethod NoSuchMethodException]:error={}",var5.getMessage(),var5);
                } catch (InvocationTargetException var6) {
                    log.error("[core CcbDesitizedUtil executeIsEffictiveMethod InvocationTargetException]:error={}",var6.getMessage(),var6);
                } catch (IllegalAccessException var7) {
                    log.error("[core CcbDesitizedUtil executeIsEffictiveMethod IllegalAccessException]:error={}",var7.getMessage(),var7);
                }
            }
        }
        return isAnnotationEffictive;
    }

    public static String lowerLineToHump(String lowerLineAndUppercaseStr) {
        //拆分成数组
        String[] eachStr = lowerLineAndUppercaseStr.split("_");
        StringBuilder resStr = new StringBuilder();
        String firstStr = "";
        String tempStr = "";
        for (int i = 0; i < eachStr.length; i++) {
            //第一个数组全部小写
            if (i == 0) {
                firstStr = eachStr[0].toLowerCase();
                resStr.append(firstStr);
            } else {
                //以后的数组首字母大写
                tempStr = capitalizeTheFirstLetter(eachStr[i]);
                resStr.append(tempStr);
            }
        }

        return resStr.toString();
    }

    public static String capitalizeTheFirstLetter(String str) {
        char firstChar = str.toUpperCase().charAt(0);
        String nextStr = str.toLowerCase().substring(1);
        return firstChar + nextStr;
    }
}

3、脱敏处理类

抽象处理接口

public abstract class AbstractDesensitized {
    public abstract String handler(Object javaBean,String valueStr);
}

身份证加密方式

@Slf4j
@Component
public class IdCardNumDesensitized extends AbstractDesensitized {
    @Override
    public String handler(Object javaBean, String id) {
        if (StrUtil.isNotBlank(id)) {
            String num = StringUtils.rightPad(id, 4);
            return StringUtils.rightPad(num, StringUtils.length(id), "*");
        }
        return "";
    }
}

4.使用说明:在进行扩展时,先定义对应的枚举,然后实现数据脱敏处理接口,即可进行扩展。

 

标签:var7,java,String,脱敏,error,注解,public,javaBean
From: https://www.cnblogs.com/Eastern-Towns/p/17537692.html

相关文章

  • java入门概念个人理解之package与import浅析
    java入门概念个人理解之package与import浅析由于近来学习java,遇到了一些在c++上没有的概念,将它记http://录下,以自己复习使用,如有不理解妥之处,望大家批评指导。资料均由网上经过自己整合理解而来,如有侵权请通知我将起删除即可。我就以package与import开始吧。package的作用其实就是......
  • 一次简单的Java服务性能优化,实现压测 QPS 翻倍
    背景前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了。在很低的QPS压力下服务器load就能达到10-20,CPU使用率60%以上,而且在每次流量峰值时接口都会大量报错,虽然使用了服务熔断框架Hystrix,但熔断后服务却迟迟不......
  • Java学习
    JDBC核心api使用步骤:1注册驱动,依赖的jar包,进行安装2.建立连接connection3.创建发送SQL语句对象4.statement对象(小汽车),发送SQL语句到数据库并且返回获取结果5.解析结果集6.销毁(释放)资源:释放connection 释放statement 释放resultset......
  • Java字符串比较 == 和 equals方法的区别
    今天在排除一个bug的时候出现了一个很低级但是也很容易被忽视的错误,在此写了一个小例子做记录。首先我先说一下错误的场景,我读取了一段json数据,并使用JSONObject的实例对象的getString方法去拿到了一个value数据,由于我忽视了getString方法的返回值是一个String对象,所以我在后面......
  • java Swing和AWT是什么关系?
    1)AWT是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。参考:https://www.cnblogs.com/RUI2022/p/16975881.html参考2:https://www.cnblogs.com/2008nmj/p/16257373.html(ge......
  • 如何实现Java转账借口的具体操作步骤
    Java转账接口实现指南引言作为一名经验丰富的开发者,我将向你介绍如何实现Java转账接口。在本文中,我将为你展示整个流程,并提供逐步指导,帮助你理解每一步需要做什么。让我们开始吧!流程概述下表展示了实现Java转账接口的步骤:步骤描述1创建一个Java类2添加转账方法......
  • 如何实现Java中使用注解校验参数的具体操作步骤
    Java中使用注解校验参数简介在Java开发中,我们经常需要对方法的参数进行校验,以确保传入的参数符合我们的要求。而注解是一种常用的方式来实现参数校验。本文将介绍如何在Java中使用注解来校验参数,并给出一些示例代码帮助理解。整体流程下面是使用注解校验参数的整体流程,我们将通......
  • Java中如何将int型转换成float型 这个问题怎么解决?
    Java中如何将int型转换成float型在Java中,将int型转换成float型可以通过类型转换来实现。这在处理数字计算或者进行数据类型转换时非常常见。下面我们来解决一个实际问题,示范如何将int型转换成float型。实际问题假设我们要编写一个Java程序来计算一个人的BMI(BodyMassIndex)指数......
  • 解决Java中的byte数组不够补空格的具体操作步骤
    Java中的byte数组不够补空格在Java编程中,我们经常需要处理二进制数据,其中byte数组是一种常见的数据类型。然而,在某些情况下,我们可能需要将byte数组的长度扩展到指定的长度,不足的部分用空格进行补齐。本文将介绍在Java中如何实现byte数组的补齐操作,并提供相关代码示例。为什么需要......
  • 解决Java中变量+字符的具体操作步骤
    Java中变量+字符实现方法详解引言在Java中,我们可以将变量与字符结合使用,以实现一些特定的功能。本文将详细介绍如何在Java中实现变量与字符的操作,并提供相应的示例代码。流程为了更好地理解如何实现变量与字符的操作,我们可以将整个过程分解为以下几个步骤:步骤描述1......