使用AOP切面对返回的数据进行脱敏的问题

1.注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @Author: xiaoxin* @Date: 2023/7/21 17:15*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface Encrypt {Type type() default Type.MOBILE_PHONE;enum Type {//用户idUSER_ID,//中文名CHINESE_NAME,//身份证号ID_CARD,//座机号FIXED_PHONE,//手机号MOBILE_PHONE,//地址ADDRESS,//电子邮件EMAIL,//密码PASSWORD,//中国大陆车牌,包含普通车辆、新能源车辆CAR_LICENSE,//银行卡BANK_CARD,//字符串STR}}

2.EncryptUtil工具

import cn.hutool.core.util.DesensitizedUtil;
import io.ctc.commons.tools.utils.StringUtils;import java.lang.reflect.Field;/*** @Author: xiaoxin* @Date: 2023/7/21 17:16*/
public class EncryptUtil {public static void encryptFields(Object obj) {Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Encrypt.class)) {Encrypt encryptAnnotation = field.getAnnotation(Encrypt.class);Encrypt.Type type = encryptAnnotation.type();field.setAccessible(true);try {String value = (String) field.get(obj);String encryptedValue = encryptValue(type, value);field.set(obj, encryptedValue);} catch (IllegalAccessException e) {e.printStackTrace();}}}}/**** 根据类型进行脱敏处理* @param type* @param value* @return*/public static String encryptValue(Encrypt.Type type, String value) {StringBuffer sb = new StringBuffer();switch (type) {case USER_ID:sb.append(DesensitizedUtil.userId());break;case CHINESE_NAME:sb.append(DesensitizedUtil.chineseName(value));break;case ID_CARD:sb.append(DesensitizedUtil.idCardNum(value, 1, 2));break;case FIXED_PHONE:sb.append(DesensitizedUtil.fixedPhone(value));break;case MOBILE_PHONE:sb.append(DesensitizedUtil.mobilePhone(value));break;case ADDRESS:sb.append(DesensitizedUtil.address(value,6));break;case EMAIL:sb.append(DesensitizedUtil.email(value));break;case PASSWORD:sb.append(DesensitizedUtil.password(value));break;case CAR_LICENSE:sb.append(DesensitizedUtil.carLicense(value));break;case BANK_CARD:sb.append(DesensitizedUtil.bankCard(value));break;case STR:if (StringUtils.isNotBlank(encryptionStr(value))){sb.append(encryptionStr(value));}break;}return sb.toString();}/**** 自定义字符串处理* @param str* @return*/public static String encryptionStr(String str) {if (StringUtils.isBlank(str)){return "";}int length = str.length();if (length <= 4){return str;}// 替换的起始位置int startIndex = (length - 3) / 2;// 替换的结束位置int endIndex = startIndex + 3;// 替换为4个*String replacement = "****";StringBuilder sb = new StringBuilder(str);sb.replace(startIndex, endIndex, replacement);return sb.toString();}
}

3.EncryptAspect切面类

import io.ctc.commons.tools.utils.Result;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Objects;/*** @author xiaoxin*/
@Aspect
@Component
public class EncryptAspect {protected Logger logger = LoggerFactory.getLogger(getClass());@Pointcut("@annotation(io.util.test.Encrypt)")public void encryptDataPointCut() {}/**** 后置增强,返回数据脱敏切面类,页面上有部分数据是不能对外展示的,此方法不支持反脱敏* 示例:原数据19879835555   脱敏后198****5555* @param point* @throws Throwable*/@AfterReturning(value = "encryptDataPointCut()",returning = "returnValue")public void around(JoinPoint point, Object returnValue){logger.info("---------------后置增强~~~~对部分数据脱敏---------------");if (Objects.nonNull(returnValue)){//1.判断object是否可以转换为List<?>类型if (returnValue instanceof List<?>){List list = (List) returnValue;list.stream().forEach(a->{EncryptUtil.encryptFields(a);});}else//2.result对象,属性有code、msg、dataif (returnValue instanceof Result){try{Result result = (Result) returnValue;Object data = result.getData();if (Objects.nonNull(data)){if (data instanceof List<?>){List list = (List) data;list.stream().forEach(a->{EncryptUtil.encryptFields(a);});}else {EncryptUtil.encryptFields(data);}}}catch (ClassCastException e){throw new ClassCastException("数据脱敏转换失败");}}else {EncryptUtil.encryptFields(returnValue);}}}
}

4.User对象(需要脱敏的属性)

import io.util.test.Encrypt;
import lombok.Data;/*** 测试* @Author: xiaoxin* @Date: 2023/7/21 17:16*/
@Data
public class User {@Encrypt(type = Encrypt.Type.USER_ID)private String user_id;@Encrypt(type = Encrypt.Type.CHINESE_NAME)private String chinese_name;@Encrypt(type = Encrypt.Type.ID_CARD)private String id_card;@Encrypt(type = Encrypt.Type.FIXED_PHONE)private String fixed_phone;@Encrypt(type = Encrypt.Type.MOBILE_PHONE)private String mobile_phone;@Encrypt(type = Encrypt.Type.ADDRESS)private String  address;@Encrypt(type = Encrypt.Type.EMAIL)private String email;@Encrypt(type = Encrypt.Type.PASSWORD)private String password;@Encrypt(type = Encrypt.Type.CAR_LICENSE)private String car_license;@Encrypt(type = Encrypt.Type.BANK_CARD)private String bank_card;@Encrypt(type = Encrypt.Type.STR)private String str;}

5.下面为测试:

Controller

service

 结果:

 

统一返回结果就上面这样子的,controller上打上注解,实体类上根据类型打上注解就可以了。可以支持返回对象、List集合,分页的谁要的话在切面里写一下就好了,DesensitizedUtil是hutool的。

 

 

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

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

相关文章

python文件处理方式

python文件处理方式 file open(D:\pythonText.txt, r, encodingUTF-8) print(file) # <_io.TextIOWrapper nameD:\\pythonText.txt moder encodingUTF-8> print(type(file)) # <class _io.TextIOWrapper>读取文件 file open(D:\pythonText.txt, r, encodingU…

3d软件动物生活习性仿真互动教学有哪些优势

软体动物是一类广泛存在于海洋和淡水环境中的生物&#xff0c;其独特的形态和生活习性给学生带来了新奇和有趣的学习主题&#xff0c;为了方便相关专业学科日常授课教学&#xff0c;web3d开发公司深圳华锐视点基于真实的软体动物&#xff0c;制作软体动物3D虚拟展示系统&#x…

【visual studio2019】如何打开即时窗口

在 Visual Studio2019 中打开即时窗口&#xff0c;有两种方法&#xff1a; 1、可以通过“调试”菜单&#xff0c;然后选择“窗口”下的“即时窗口”选项 2、直接使用快捷键“Ctrl Alt I” 此时即时窗口将显示在 Visual Studio2019 的底部。在即时窗口中&#xff0c;可以执…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…

stable diffusion

一&#xff1a;安装。 stable diffusion 安装和使用全教程 - 知乎 Stable Diffusion安装 - 知乎 环境安装&#xff1a; 1&#xff1a;python 3.10安装。 Download Python | Python.org 切记要安装3.10版本&#xff0c;因为Stable diffusion是用3.10版本编写的&#xff0c;所…

【C++】 哈希

一、哈希的概念及其性质 1.哈希概念 在顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。比如顺序表需要从第一个元素依次向后进行查找&#xff0c;顺序查找时间复杂度为…

VS Code环境配置问题

VS Code 环境配置问题 文章目录 VS Code 环境配置问题配置 C问题解决不乱码只显示结果避免闪退&#xff0c;中文乱码 配置 Java下载 JDKJDK 环境配置安装插件 配置 C 跟着官网教程&#xff08;英文版&#xff09;和其他博客配置了一遍&#xff0c;却遇到了很多小问题&#xff…

MyBatis源码剖析之延迟加载源码细节

文章目录 什么是延迟加载&#xff1f;实现局部延迟加载全局延迟加载 延迟加载原理实现延迟加载原理&#xff08;源码剖析)Setting 配置加载&#xff1a;延迟加载代理对象创建注意事项 什么是延迟加载&#xff1f; 在开发过程中很多时候我们并不需要总是在加载⽤户信息时就⼀定…

Android 开发代码规范

一. AndroidStudio开发工具规范 使用最新的稳定版本.统一文件的编码格式为utf-8. 清除每个类里面的无效的import导包.代码样式统一,比如&#xff0c;tab缩进4个空格&#xff0c;或者 tab size等如果没有特殊情况使用默认的配置即可。每行字数每行字符数不得超过 160 字符&…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

Mysql-MVCC 并发版本控制

参考链接&#xff1a;一文读懂MVCC实现原理_Nicolos_Z的博客-CSDN博客 1.总述&#xff1a; MVCC 主要是InnoDB解决数据库事务读写&#xff0c;导致的脏读、重复读问题的处理方法。通过快照读的方式&#xff0c;提高数据库并发查询的能力。 2.MVCC的实现 实现MVCC主要用到了…

在OK3588板卡上部署模型实现人工智能OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2&#xff08;该工具不能在OK3588板卡上完成模型转换&#xff09; git clone https://github.com/rockchip-linux/rknn-to…

金蝶云星空任意文件读取漏洞复现(0day)

0x01 产品简介 金蝶云星空是一款云端企业资源管理&#xff08;ERP&#xff09;软件&#xff0c;为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织&#xff0c;多利润中心的大中型企业&#xff0c;以 “开放、标准、社交”三大特性为数字…

ChatGPT伦理挑战:人工智能的权利与责任

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HCIP期中实验

考试需求 1 、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 OSPF 协议…

实时协作:团队效率倍增的关键

实时协作是指团队在当前时刻共同完成项目的能力。无论是否使用技术&#xff0c;都能实现这一点。然而&#xff0c;随着远程工作的盛行&#xff0c;安全的协作工具被用来让团队成员在项目和一般业务之间保持联系和同步。 传统协作与实时协作的区别 两种类型的协作最明显的区别…

uniapp 微信小程序 navigationBarBackgroundColor 标题栏颜色渐变

大体思路&#xff1a; 第一步&#xff1a;“navigationStyle”:“custom” 第二步&#xff1a; template内 重点&#xff1a;给view添加ref“top” 第三步&#xff1a;添加渐变色样式 1、pages.json {"path" : "pages/user/user","style" : …

【玩转Linux】Linux输入子系统简介

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异&#xff0c;无法完美兼容最新的无线网卡技术&#xff0c;在连接网络时&#xff08;特别是网络负载较大的情况下&#xff09;&#xff0c;可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况&#xff1b;可尝试下面方法进行调整。 1…

前端小练-仿掘金导航栏

文章目录 前言项目结构导航实现创作中心移动小球消息提示 完整代码 前言 闲的&#xff0c;你信嘛&#xff0c;还得开发一个基本的门户社区网站&#xff0c;来给到Hlang,不然我怕说工作量不够。那么这个的话&#xff0c;其实也很好办&#xff0c;主要是这个门户网站的UI写起来麻…