1起因
最近在写一个功能,对用户敏感的数据进行脱敏,在网上看一圈基本上都是全局范围的,我觉得应该更加灵活,在不同场景,不同业务下进行脱敏更加合适。
JsonSerializer介绍就参考这位大佬的
https://juejin.cn/post/6872636051237240846
aop介绍参考这位大佬的
https://juejin.cn/post/6844903575441637390
2初步尝试
枚举类
@Component@AspectpublicclassPrivacyKeyAspect{publicstaticfinalLoggerlogger=LoggerFactory.getLogger(PrivacyKeyAspect.class);/***@Description:环绕通知包含此注解的*@param:ProceedingJoinPointjoinPoint*@return:Object*/@Around(value="@annotation("aop注解地址xxxxx")")publicObjectrepeatSub(ProceedingJoinPointjoinPoint)throwsThrowable{returnjoinPoint.proceed();}/***@Description:后置通知*/@AfterReturning(value="@annotation("aop注解地址")",returning="result")publicvoidsetPrivacyKeyType(JoinPointjoinPoint,Objectresult)throwsThrowable{//进行注解值获取MethodSignaturesignature=(MethodSignature)joinPoint.getSignature();Methodmethod=signature.getMethod();//是否开启脱敏booleanflag=method.getDeclaredAnnotation(PrivacyKeyAnnotation.class).isKey();//是否对分页进行脱敏booleanstatus=method.getDeclaredAnnotation(PrivacyKeyAnnotation.class).isPageKey();if(!status){//进行返回值反射Class<?>aClass=ClassRecursionUtils.getClass(result.getClass(),"isPrivacyKey");if(null!=aClass){setFieldMethod(result,flag,aClass);}}else{//反射分页page//反射list类型Parameter[]parameters=signature.getMethod().getParameters();//泛型名称Stringname=parameters[0].getName();//泛型classClass<?>type=parameters[0].getType();//包名StringtypeName=type.getName();PropertyDescriptor[]ps=Introspector.getBeanInfo(result.getClass(),Object.class).getPropertyDescriptors();for(PropertyDescriptorprop:ps){if(prop.getPropertyType().isAssignableFrom(List.class)){//List集合类型Objectobj=result.getClass().getMethod(prop.getReadMethod().getName()).invoke(result);if(obj!=null){List<?>listObj=(List<?>)obj;for(Objectnext:listObj){Class<?>classObj=Class.forName(typeName);//获取成员变量Class<?>keyClass=ClassRecursionUtils.getClass(classObj,"isPrivacyKey");setFieldMethod(next,flag,keyClass);}}}}}}/***内容填充*/privatevoidsetFieldMethod(Objectresult,booleanflag,Class<?>aClass)throwsIllegalAccessException{Field[]declaredFields=aClass.getDeclaredFields();for(Fieldfield:declaredFields){//设置属性的可访问性field.setAccessible(true);//只获取isPrivacyKeyStringname=field.getName();//过滤非布尔类型Class<?>type=field.getType();//并且只添加isPrivacyKeyif(type.isAssignableFrom(Boolean.class)&&"isPrivacyKey".equals(name)){//重新写入field.set(result,flag);}}}}
使用 在service implement类方法上写入
最后,另一种实现方式,可以参考:
https://juejin.cn/post/7242145254057410615
来源:juejin.cn/post/7225848846785544247
构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以
交流技术、职位内推、行业探讨为主
广告人士勿入,切勿轻信私聊,防止被骗

本篇文章来源于微信公众号: Java笔记虾
微信扫描下方的二维码阅读本文

Comments NOTHING