可以对数据加密,解密,对数据库加密的数据进行解密显示,对数据库没有加密的数据进行加密处理展示前端等待  1:引入数据如下结构 
 
 1-1:SensitiveDecode脱敏解密注解 package  com. example. poi. desensitization. annotation ; import  java. lang. annotation.  * ; 
@Documented 
@Retention ( RetentionPolicy . RUNTIME ) 
@Target ( { ElementType . METHOD } ) 
public  @interface  SensitiveDecode  { Class  entity ( )  default  Object . class ; 
}  1-2:SensitiveEncode脱敏加密注解 package  com. example. poi. desensitization. annotation ; import  java. lang. annotation.  * ; 
@Documented 
@Retention ( RetentionPolicy . RUNTIME ) 
@Target ( { ElementType . METHOD } ) 
public  @interface  SensitiveEncode  { Class  entity ( )  default  Object . class ; 
}  1-3:SensitiveField字段注解 package  com. example. poi. desensitization. annotation ; import  com. example. poi. desensitization. enums.  SensitiveEnum ; import  java. lang. annotation.  * ; 
@Documented 
@Retention ( RetentionPolicy . RUNTIME ) 
@Target ( ElementType . FIELD ) 
public  @interface  SensitiveField  { SensitiveEnum  type ( )  default  SensitiveEnum . ENCODE ; 
}  1-4:SensitiveDataAspect敏感数据切面处理类 package  com. example. poi. desensitization. aspect ; import  com. example. poi. desensitization. annotation.  SensitiveDecode ; 
import  com. example. poi. desensitization. annotation.  SensitiveEncode ; 
import  com. example. poi. desensitization. utils.  SensitiveInfoUtil ; 
import  lombok. extern. slf4j.  Slf4j ; import  org. aspectj. lang.  ProceedingJoinPoint ; 
import  org. aspectj. lang. annotation.  Around ; 
import  org. aspectj. lang. annotation.  Aspect ; 
import  org. aspectj. lang. annotation.  Pointcut ; 
import  org. aspectj. lang. reflect.  MethodSignature ; 
import  org. springframework. stereotype.  Component ; import  java. lang. reflect.  Method ; 
import  java. util.  List ; 
@Slf4j 
@Aspect 
@Component 
public  class  SensitiveDataAspect  { @Pointcut ( "@annotation(com.example.poi.desensitization.annotation.SensitiveEncode) || @annotation(com.example.poi.desensitization.annotation.SensitiveDecode)" ) public  void  sensitivePointCut ( )  { } @Around ( "sensitivePointCut()" ) public  Object  around ( ProceedingJoinPoint  point)  throws  Throwable  { Object  result =  point. proceed ( ) ; if ( result ==  null ) { return  result; } Class  resultClass =  result. getClass ( ) ; log. debug ( " resultClass  = {}"  ,  resultClass) ; if ( resultClass. isPrimitive ( ) ) { return  result; } boolean  isEncode =  true ; Class  entity =  null ; MethodSignature  methodSignature =  ( MethodSignature )  point. getSignature ( ) ; Method  method =  methodSignature. getMethod ( ) ; SensitiveEncode  encode =  method. getAnnotation ( SensitiveEncode . class ) ; if ( encode== null ) { SensitiveDecode  decode =  method. getAnnotation ( SensitiveDecode . class ) ; if ( decode!= null ) { entity =  decode. entity ( ) ; isEncode =  false ; } } else { entity =  encode. entity ( ) ; } long  startTime= System . currentTimeMillis ( ) ; if ( resultClass. equals ( entity)  ||  entity. equals ( Object . class ) ) { SensitiveInfoUtil . handlerObject ( result,  isEncode) ; }  else  if ( result instanceof  List ) { SensitiveInfoUtil . handleList ( result,  entity,  isEncode) ; } else { SensitiveInfoUtil . handleNestedObject ( result,  entity,  isEncode) ; } long  endTime= System . currentTimeMillis ( ) ; log. info ( ( isEncode ?  "加密操作,"  :  "解密操作," )  +  "Aspect程序耗时:"  +  ( endTime -  startTime)  +  "ms" ) ; return  result; } } 
 1-5:SensitiveEnum package  com. example. poi. desensitization. enums ; 
public  enum  SensitiveEnum  { ENCODE , CHINESE_NAME , ID_CARD , FIXED_PHONE , MOBILE_PHONE , ADDRESS , EMAIL , BANK_CARD , CNAPS_CODE ; }  1-6:AesEncryptUtil加密工具类 package  com. example. poi. desensitization. utils. encryption ; import  cn. hutool. core. codec.  Base64 ; 
import  cn. hutool. crypto.  SecureUtil ; 
import  javax. crypto.  Cipher ; 
import  javax. crypto. spec.  IvParameterSpec ; 
import  javax. crypto. spec.  SecretKeySpec ; 
public  class  AesEncryptUtil  { private  static  String  KEY  =  EncryptedString . key; private  static  String  IV  =  EncryptedString . iv; public  static  String  encrypt ( String  data,  String  key,  String  iv)  throws  Exception  { try  { Cipher  cipher =  Cipher . getInstance ( "AES/CBC/NoPadding" ) ; int  blockSize =  cipher. getBlockSize ( ) ; byte [ ]  dataBytes =  data. getBytes ( ) ; int  plaintextLength =  dataBytes. length; if  ( plaintextLength %  blockSize !=  0 )  { plaintextLength =  plaintextLength +  ( blockSize -  ( plaintextLength %  blockSize) ) ; } byte [ ]  plaintext =  new  byte [ plaintextLength] ; System . arraycopy ( dataBytes,  0 ,  plaintext,  0 ,  dataBytes. length) ; SecretKeySpec  keyspec =  new  SecretKeySpec ( key. getBytes ( ) ,  "AES" ) ; IvParameterSpec  ivspec =  new  IvParameterSpec ( iv. getBytes ( ) ) ; cipher. init ( Cipher . ENCRYPT_MODE ,  keyspec,  ivspec) ; byte [ ]  encrypted =  cipher. doFinal ( plaintext) ; return  Base64 . encode ( encrypted) ; }  catch  ( Exception  e)  { e. printStackTrace ( ) ; return  null ; } } public  static  String  desEncrypt ( String  data,  String  key,  String  iv)  throws  Exception  { byte [ ]  encrypted1 =  Base64 . decode ( data) ; Cipher  cipher =  Cipher . getInstance ( "AES/CBC/NoPadding" ) ; SecretKeySpec  keyspec =  new  SecretKeySpec ( key. getBytes ( ) ,  "AES" ) ; IvParameterSpec  ivspec =  new  IvParameterSpec ( iv. getBytes ( ) ) ; cipher. init ( Cipher . DECRYPT_MODE ,  keyspec,  ivspec) ; byte [ ]  original =  cipher. doFinal ( encrypted1) ; String  originalString =  new  String ( original) ; return  originalString. replaceAll ( "\\u0000" ,  "" ) ; } public  static  String  encrypt ( String  data)  throws  Exception  { return  encrypt ( data,  KEY ,  IV ) ; } public  static  String  desEncrypt ( String  data)  throws  Exception  { return  desEncrypt ( data,  KEY ,  IV ) ; } public  static  void  main ( String  args[ ] )  throws  Exception  { String  test1 =  "sa" ; String  test = new  String ( test1. getBytes ( ) , "UTF-8" ) ; String  data =  "4I80+jJsZ/aR+n+MsRd7qw==" ; String  key =   KEY ; String  iv =  IV ; String  jiemi = desEncrypt ( data,  key,  iv) . trim ( ) ; System . out. println ( "解密:" + jiemi) ; String  aa= "1234567897891" ; String  encrypt =  SecureUtil . aes ( key. getBytes ( ) ) . encryptBase64 ( aa) ; String  s =  SecureUtil . aes ( key. getBytes ( ) ) . decryptStr ( encrypt) ; System . out. println ( "" ) ; } 
} 
 1-7:EncryptedString package  com. example. poi. desensitization. utils. encryption ; import  lombok.  Data ; 
@Data 
public  class  EncryptedString  { public  static   String  key =  "1234567890adbcde" ; public  static   String  iv  =  "1234567890hjlkew" ; 
}  1-8:CommonConstant通用常量 package  com. example. poi. desensitization. utils ; 
public  interface  CommonConstant  { String  UNKNOWN  =  "unknown" ; String  STRING_NULL  =  "null" ; }  1-9:oConvertUtils package  com. example. poi. desensitization. utils ; import  lombok. extern. slf4j.  Slf4j ; import  org. apache. commons. io.  IOUtils ; 
import  org. springframework. beans.  BeanUtils ; 
import  javax. servlet. http.  HttpServletRequest ; 
import  java. io.  IOException ; 
import  java. io.  InputStream ; 
import  java. io.  UnsupportedEncodingException ; 
import  java. lang. reflect.  Field ; 
import  java. math.  BigDecimal ; 
import  java. math.  BigInteger ; 
import  java. net.  InetAddress ; 
import  java. net.  NetworkInterface ; 
import  java. net.  SocketException ; 
import  java. net.  UnknownHostException ; 
import  java. sql.  Date ; 
import  java. util.  * ; 
import  java. util. regex.  Matcher ; 
import  java. util. regex.  Pattern ; @Slf4j 
public  class  oConvertUtils { public  static  boolean  isEmpty ( Object  object)  { if  ( object ==  null )  { return  ( true ) ; } if  ( "" . equals ( object) )  { return  ( true ) ; } if  ( CommonConstant . STRING_NULL . equals ( object) )  { return  ( true ) ; } return  ( false ) ; } public  static  boolean  isNotEmpty ( Object  object)  { if  ( object !=  null  &&  ! "" . equals ( object)  &&  ! object. equals ( CommonConstant . STRING_NULL ) )  { return  ( true ) ; } return  ( false ) ; } public  static  String  decode ( String  strIn,  String  sourceCode,  String  targetCode)  { String  temp =  code2code ( strIn,  sourceCode,  targetCode) ; return  temp; } @SuppressWarnings ( "AlibabaLowerCamelCaseVariableNaming" ) public  static  String  StrToUTF ( String  strIn,  String  sourceCode,  String  targetCode)  { strIn =  "" ; try  { strIn =  new  String ( strIn. getBytes ( "ISO-8859-1" ) ,  "GBK" ) ; }  catch  ( UnsupportedEncodingException  e)  { e. printStackTrace ( ) ; } return  strIn; } private  static  String  code2code ( String  strIn,  String  sourceCode,  String  targetCode)  { String  strOut =  null ; if  ( strIn ==  null  ||  "" . equals ( strIn. trim ( ) ) )  { return  strIn; } try  { byte [ ]  b =  strIn. getBytes ( sourceCode) ; for  ( int  i =  0 ;  i <  b. length;  i++ )  { System . out. print ( b[ i]  +  "  " ) ; } strOut =  new  String ( b,  targetCode) ; }  catch  ( Exception  e)  { e. printStackTrace ( ) ; return  null ; } return  strOut; } public  static  int  getInt ( String  s,  int  defval)  { if  ( s ==  null  ||  s ==  "" )  { return  ( defval) ; } try  { return  ( Integer . parseInt ( s) ) ; }  catch  ( NumberFormatException  e)  { return  ( defval) ; } } public  static  int  getInt ( String  s)  { if  ( s ==  null  ||  s ==  "" )  { return  0 ; } try  { return  ( Integer . parseInt ( s) ) ; }  catch  ( NumberFormatException  e)  { return  0 ; } } public  static  int  getInt ( String  s,  Integer  df)  { if  ( s ==  null  ||  s ==  "" )  { return  df; } try  { return  ( Integer . parseInt ( s) ) ; }  catch  ( NumberFormatException  e)  { return  0 ; } } public  static  Integer [ ]  getInts ( String [ ]  s)  { if  ( s ==  null )  { return  null ; } Integer [ ]  integer =  new  Integer [ s. length] ; for  ( int  i =  0 ;  i <  s. length;  i++ )  { integer[ i]  =  Integer . parseInt ( s[ i] ) ; } return  integer; } public  static  double  getDouble ( String  s,  double  defval)  { if  ( s ==  null  ||  s ==  "" )  { return  ( defval) ; } try  { return  ( Double . parseDouble ( s) ) ; }  catch  ( NumberFormatException  e)  { return  ( defval) ; } } public  static  double  getDou ( Double  s,  double  defval)  { if  ( s ==  null )  { return  ( defval) ; } return  s; } public  static  int  getInt ( Object  object,  int  defval)  { if  ( isEmpty ( object) )  { return  ( defval) ; } try  { return  ( Integer . parseInt ( object. toString ( ) ) ) ; }  catch  ( NumberFormatException  e)  { return  ( defval) ; } } public  static  Integer  getInt ( Object  object)  { if  ( isEmpty ( object) )  { return  null ; } try  { return  ( Integer . parseInt ( object. toString ( ) ) ) ; }  catch  ( NumberFormatException  e)  { return  null ; } } public  static  int  getInt ( BigDecimal  s,  int  defval)  { if  ( s ==  null )  { return  ( defval) ; } return  s. intValue ( ) ; } public  static  Integer [ ]  getIntegerArry ( String [ ]  object)  { int  len =  object. length; Integer [ ]  result =  new  Integer [ len] ; try  { for  ( int  i =  0 ;  i <  len;  i++ )  { result[ i]  =  new  Integer ( object[ i] . trim ( ) ) ; } return  result; }  catch  ( NumberFormatException  e)  { return  null ; } } public  static  String  getString ( String  s)  { return  ( getString ( s,  "" ) ) ; } public  static  String  getString ( Object  object)  { if  ( isEmpty ( object) )  { return  "" ; } return  ( object. toString ( ) . trim ( ) ) ; } public  static  String  getString ( int  i)  { return  ( String . valueOf ( i) ) ; } public  static  String  getString ( float  i)  { return  ( String . valueOf ( i) ) ; } public  static  String  getString ( String  s,  String  defval)  { if  ( isEmpty ( s) )  { return  ( defval) ; } return  ( s. trim ( ) ) ; } public  static  String  getString ( Object  s,  String  defval)  { if  ( isEmpty ( s) )  { return  ( defval) ; } return  ( s. toString ( ) . trim ( ) ) ; } public  static  long  stringToLong ( String  str)  { Long  test =  new  Long ( 0 ) ; try  { test =  Long . valueOf ( str) ; }  catch  ( Exception  e)  { } return  test. longValue ( ) ; } public  static  String  getIp ( )  { String  ip =  null ; try  { InetAddress  address =  InetAddress . getLocalHost ( ) ; ip =  address. getHostAddress ( ) ; }  catch  ( UnknownHostException  e)  { e. printStackTrace ( ) ; } return  ip; } private  static  boolean  isBaseDataType ( Class  clazz)  throws  Exception  { return  ( clazz. equals ( String . class )  ||  clazz. equals ( Integer . class )  ||  clazz. equals ( Byte . class )  ||  clazz. equals ( Long . class )  ||  clazz. equals ( Double . class )  ||  clazz. equals ( Float . class )  ||  clazz. equals ( Character . class )  ||  clazz. equals ( Short . class )  ||  clazz. equals ( BigDecimal . class )  ||  clazz. equals ( BigInteger . class )  ||  clazz. equals ( Boolean . class )  ||  clazz. equals ( Date . class )  ||  clazz. isPrimitive ( ) ) ; } public  static  String  getIpAddrByRequest ( HttpServletRequest  request)  { String  ip =  request. getHeader ( "x-forwarded-for" ) ; if  ( ip ==  null  ||  ip. length ( )  ==  0  ||  CommonConstant . UNKNOWN . equalsIgnoreCase ( ip) )  { ip =  request. getHeader ( "Proxy-Client-IP" ) ; } if  ( ip ==  null  ||  ip. length ( )  ==  0  ||  CommonConstant . UNKNOWN . equalsIgnoreCase ( ip) )  { ip =  request. getHeader ( "WL-Proxy-Client-IP" ) ; } if  ( ip ==  null  ||  ip. length ( )  ==  0  ||  CommonConstant . UNKNOWN . equalsIgnoreCase ( ip) )  { ip =  request. getRemoteAddr ( ) ; } return  ip; } public  static  String  getRealIp ( )  throws  SocketException  { String  localip =  null ; String  netip =  null ; Enumeration < NetworkInterface > =  NetworkInterface . getNetworkInterfaces ( ) ; InetAddress  ip =  null ; boolean  finded =  false ; while  ( netInterfaces. hasMoreElements ( )  &&  ! finded)  { NetworkInterface  ni =  netInterfaces. nextElement ( ) ; Enumeration < InetAddress > =  ni. getInetAddresses ( ) ; while  ( address. hasMoreElements ( ) )  { ip =  address. nextElement ( ) ; if  ( ! ip. isSiteLocalAddress ( )  &&  ! ip. isLoopbackAddress ( )  &&  ip. getHostAddress ( ) . indexOf ( ":" )  ==  - 1 )  { netip =  ip. getHostAddress ( ) ; finded =  true ; break ; }  else  if  ( ip. isSiteLocalAddress ( )  &&  ! ip. isLoopbackAddress ( )  &&  ip. getHostAddress ( ) . indexOf ( ":" )  ==  - 1 )  { localip =  ip. getHostAddress ( ) ; } } } if  ( netip !=  null  &&  ! "" . equals ( netip) )  { return  netip; }  else  { return  localip; } } public  static  String  replaceBlank ( String  str)  { String  dest =  "" ; if  ( str !=  null )  { String  reg =  "\\s*|\t|\r|\n" ; Pattern  p =  Pattern . compile ( reg) ; Matcher  m =  p. matcher ( str) ; dest =  m. replaceAll ( "" ) ; } return  dest; } public  static  boolean  isIn ( String  substring,  String [ ]  source)  { if  ( source ==  null  ||  source. length ==  0 )  { return  false ; } for  ( int  i =  0 ;  i <  source. length;  i++ )  { String  aSource =  source[ i] ; if  ( aSource. equals ( substring) )  { return  true ; } } return  false ; } public  static  Map < Object ,  Object > getHashMap ( )  { return  new  HashMap < > ( 5 ) ; } public  static  Map < Object ,  Object > setToMap ( Set < Object > )  { Map < Object ,  Object > =  getHashMap ( ) ; for  ( Iterator  iterator =  setobj. iterator ( ) ;  iterator. hasNext ( ) ; )  { Map. Entry < Object ,  Object > =  ( Map. Entry < Object ,  Object > )  iterator. next ( ) ; map. put ( entry. getKey ( ) . toString ( ) ,  entry. getValue ( )  ==  null  ?  ""  :  entry. getValue ( ) . toString ( ) . trim ( ) ) ; } return  map; } public  static  boolean  isInnerIp ( String  ipAddress)  { boolean  isInnerIp =  false ; long  ipNum =  getIpNum ( ipAddress) ; long  aBegin =  getIpNum ( "10.0.0.0" ) ; long  aEnd =  getIpNum ( "10.255.255.255" ) ; long  bBegin =  getIpNum ( "172.16.0.0" ) ; long  bEnd =  getIpNum ( "172.31.255.255" ) ; long  cBegin =  getIpNum ( "192.168.0.0" ) ; long  cEnd =  getIpNum ( "192.168.255.255" ) ; String  localIp =  "127.0.0.1" ; isInnerIp =  isInner ( ipNum,  aBegin,  aEnd)  ||  isInner ( ipNum,  bBegin,  bEnd)  ||  isInner ( ipNum,  cBegin,  cEnd)  ||  localIp. equals ( ipAddress) ; return  isInnerIp; } private  static  long  getIpNum ( String  ipAddress)  { String [ ]  ip =  ipAddress. split ( "\\." ) ; long  a =  Integer . parseInt ( ip[ 0 ] ) ; long  b =  Integer . parseInt ( ip[ 1 ] ) ; long  c =  Integer . parseInt ( ip[ 2 ] ) ; long  d =  Integer . parseInt ( ip[ 3 ] ) ; long  ipNum =  a *  256  *  256  *  256  +  b *  256  *  256  +  c *  256  +  d; return  ipNum; } private  static  boolean  isInner ( long  userIp,  long  begin,  long  end)  { return  ( userIp >=  begin)  &&  ( userIp <=  end) ; } public  static  String  camelName ( String  name)  { StringBuilder  result =  new  StringBuilder ( ) ; if  ( name ==  null  ||  name. isEmpty ( ) )  { return  "" ; }  else  if  ( ! name. contains ( SymbolConstant . UNDERLINE ) )  { return  name. substring ( 0 ,  1 ) . toLowerCase ( )  +  name. substring ( 1 ) . toLowerCase ( ) ; } String [ ]  camels =  name. split ( "_" ) ; for  ( String  camel :  camels)  { if  ( camel. isEmpty ( ) )  { continue ; } if  ( result. length ( )  ==  0 )  { result. append ( camel. toLowerCase ( ) ) ; }  else  { result. append ( camel. substring ( 0 ,  1 ) . toUpperCase ( ) ) ; result. append ( camel. substring ( 1 ) . toLowerCase ( ) ) ; } } return  result. toString ( ) ; } public  static  String  camelNames ( String  names)  { if ( names== null || "" . equals ( names) ) { return  null ; } StringBuffer  sf =  new  StringBuffer ( ) ; String [ ]  fs =  names. split ( "," ) ; for  ( String  field :  fs)  { field =  camelName ( field) ; sf. append ( field +  "," ) ; } String  result =  sf. toString ( ) ; return  result. substring ( 0 ,  result. length ( )  -  1 ) ; } public  static  String  camelNameCapFirst ( String  name)  { StringBuilder  result =  new  StringBuilder ( ) ; if  ( name ==  null  ||  name. isEmpty ( ) )  { return  "" ; }  else  if  ( ! name. contains ( SymbolConstant . UNDERLINE ) )  { return  name. substring ( 0 ,  1 ) . toUpperCase ( )  +  name. substring ( 1 ) . toLowerCase ( ) ; } String [ ]  camels =  name. split ( "_" ) ; for  ( String  camel :  camels)  { if  ( camel. isEmpty ( ) )  { continue ; } result. append ( camel. substring ( 0 ,  1 ) . toUpperCase ( ) ) ; result. append ( camel. substring ( 1 ) . toLowerCase ( ) ) ; } return  result. toString ( ) ; } public  static  String  camelToUnderline ( String  para) { int  length =  3 ; if ( para. length ( ) < length) { return  para. toLowerCase ( ) ;  } StringBuilder  sb= new  StringBuilder ( para) ; int  temp= 0 ; for ( int  i= 2 ; i< para. length ( ) ; i++ ) { if ( Character . isUpperCase ( para. charAt ( i) ) ) { sb. insert ( i+ temp,  "_" ) ; temp+= 1 ; } } return  sb. toString ( ) . toLowerCase ( ) ;  } public  static  String  randomGen ( int  place)  { String  base =  "qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789" ; StringBuffer  sb =  new  StringBuffer ( ) ; Random  rd =  new  Random ( ) ; for ( int  i= 0 ; i< place; i++ )  { sb. append ( base. charAt ( rd. nextInt ( base. length ( ) ) ) ) ; } return  sb. toString ( ) ; } public  static  Field [ ]  getAllFields ( Object  object)  { Class < ? > =  object. getClass ( ) ; List < Field > =  new  ArrayList < > ( ) ; while  ( clazz !=  null )  { fieldList. addAll ( new  ArrayList < > ( Arrays . asList ( clazz. getDeclaredFields ( ) ) ) ) ; clazz =  clazz. getSuperclass ( ) ; } Field [ ]  fields =  new  Field [ fieldList. size ( ) ] ; fieldList. toArray ( fields) ; return  fields; } public  static  List < Map < String ,  Object > > toLowerCasePageList ( List < Map < String ,  Object > > ) { List < Map < String ,  Object > > =  new  ArrayList < > ( ) ; for  ( Map < String ,  Object > :  list)  { Map < String ,  Object > =  new  HashMap < > ( 5 ) ; Set < String > =  row. keySet ( ) ;  for  ( String  key :  keySet)  {  String  newKey =  key. toLowerCase ( ) ;  resultMap. put ( newKey,  row. get ( key) ) ;  } select. add ( resultMap) ; } return  select; } public  static < F , T > List < T > entityListToModelList ( List < F > ,  Class < T > ) { if ( fromList ==  null  ||  fromList. isEmpty ( ) ) { return  null ; } List < T > =  new  ArrayList < > ( ) ; for ( F  f :  fromList) { T  t =  entityToModel ( f,  tClass) ; tList. add ( t) ; } return  tList; } public  static < F , T > T  entityToModel ( F  entity,  Class < T > )  { log. debug ( "entityToModel : Entity属性的值赋值到Model" ) ; Object  model =  null ; if  ( entity ==  null  ||  modelClass == null )  { return  null ; } try  { model =  modelClass. newInstance ( ) ; }  catch  ( InstantiationException  e)  { log. error ( "entityToModel : 实例化异常" ,  e) ; }  catch  ( IllegalAccessException  e)  { log. error ( "entityToModel : 安全权限异常" ,  e) ; } BeanUtils . copyProperties ( entity,  model) ; return  ( T ) model; } public  static  boolean  listIsEmpty ( Collection  list)  { return  ( list ==  null  ||  list. size ( )  ==  0 ) ; } public  static  boolean  listIsNotEmpty ( Collection  list)  { return  ! listIsEmpty ( list) ; } public  static  String  readStatic ( String  url)  { String  json =  "" ; try  { InputStream  stream =  oConvertUtils. class . getClassLoader ( ) . getResourceAsStream ( url. replace ( "classpath:" ,  "" ) ) ; json =  IOUtils . toString ( stream, "UTF-8" ) ; }  catch  ( IOException  e)  { log. error ( e. getMessage ( ) , e) ; } return  json; } 
}  1-10:SensitiveInfoUtil package  com. example. poi. desensitization. utils ; import  com. example. poi. desensitization. enums.  SensitiveEnum ; 
import  com. example. poi. desensitization. annotation.  SensitiveField ; 
import  com. example. poi. desensitization. utils. encryption.  AesEncryptUtil ; 
import  lombok. extern. slf4j.  Slf4j ; import  java. lang. reflect.  Field ; 
import  java. lang. reflect.  ParameterizedType ; 
import  java. util.  Collections ; 
import  java. util.  List ; 
@Slf4j 
public  class  SensitiveInfoUtil  { public  static  void  handleNestedObject ( Object  obj,  Class  entity,  boolean  isEncode)  throws  IllegalAccessException  { Field [ ]  fields =  obj. getClass ( ) . getDeclaredFields ( ) ; for  ( Field  field :  fields)  { if ( field. getType ( ) . isPrimitive ( ) ) { continue ; } if ( field. getType ( ) . equals ( entity) ) { field. setAccessible ( true ) ; Object  nestedObject =  field. get ( obj) ; handlerObject ( nestedObject,  isEncode) ; break ; } else { if ( field. getGenericType ( )  instanceof  ParameterizedType ) { ParameterizedType  pt =  ( ParameterizedType ) field. getGenericType ( ) ; if ( pt. getRawType ( ) . equals ( List . class ) ) { if ( pt. getActualTypeArguments ( ) [ 0 ] . equals ( entity) ) { field. setAccessible ( true ) ; Object  nestedObject =  field. get ( obj) ; handleList ( nestedObject,  entity,  isEncode) ; break ; } } } } } } public  static  Object  handlerObject ( Object  obj,  boolean  isEncode)  throws  IllegalAccessException  { log. debug ( " obj --> " +  obj. toString ( ) ) ; long  startTime= System . currentTimeMillis ( ) ; if  ( oConvertUtils. isEmpty ( obj) )  { return  obj; } Field [ ]  fields =  obj. getClass ( ) . getDeclaredFields ( ) ; for  ( Field  field :  fields)  { boolean  isSensitiveField =  field. isAnnotationPresent ( SensitiveField . class ) ; if ( isSensitiveField) { if ( field. getType ( ) . isAssignableFrom ( String . class ) ) { field. setAccessible ( true ) ; String  realValue =  ( String )  field. get ( obj) ; if ( realValue== null  ||  "" . equals ( realValue) ) { continue ; } SensitiveField  sf =  field. getAnnotation ( SensitiveField . class ) ; if ( isEncode== true ) { String  value =  SensitiveInfoUtil . getEncodeData ( realValue,   sf. type ( ) ) ; field. set ( obj,  value) ; } else { if ( sf. type ( ) . equals ( SensitiveEnum . ENCODE ) ) { String  value =  SensitiveInfoUtil . getDecodeData ( realValue) ; field. set ( obj,  value) ; } } } } } return  obj; } public  static  void  handleList ( Object  obj,  Class  entity,  boolean  isEncode) { List  list =  ( List ) obj; if ( list. size ( ) > 0 ) { Object  first =  list. get ( 0 ) ; if ( first. getClass ( ) . equals ( entity) ) { for ( int  i= 0 ;  i< list. size ( ) ;  i++ ) { Object  temp =  list. get ( i) ; try  { handlerObject ( temp,  isEncode) ; }  catch  ( IllegalAccessException  e)  { e. printStackTrace ( ) ; } } } } } public  static  String  getDecodeData ( String  data) { String  result =  null ; try  { result =  AesEncryptUtil . desEncrypt ( data) ; }  catch  ( Exception  exception)  { log. debug ( "数据解密错误,原数据:" + data) ; } if ( oConvertUtils. isEmpty ( result)  &&  oConvertUtils. isNotEmpty ( data) ) { result =  data; } return  result; } public  static  String  getEncodeData ( String  data,  SensitiveEnum  sensitiveEnum) { String  result; switch  ( sensitiveEnum) { case  ENCODE : try  { result =  AesEncryptUtil . encrypt ( data) ; }  catch  ( Exception  exception)  { log. error ( "数据加密错误" ,  exception. getMessage ( ) ) ; result =  data; } break ; case  CHINESE_NAME : result =  chineseName ( data) ; break ; case  ID_CARD : result =  idCardNum ( data) ; break ; case  FIXED_PHONE : result =  fixedPhone ( data) ; break ; case  MOBILE_PHONE : result =  mobilePhone ( data) ; break ; case  ADDRESS : result =  address ( data,  3 ) ; break ; case  EMAIL : result =  email ( data) ; break ; case  BANK_CARD : result =  bankCard ( data) ; break ; case  CNAPS_CODE : result =  cnapsCode ( data) ; break ; default : result =  data; } return  result; } private  static  String  chineseName ( String  fullName)  { if  ( oConvertUtils. isEmpty ( fullName) )  { return  "" ; } return  formatRight ( fullName,  1 ) ; } private  static  String  chineseName ( String  familyName,  String  firstName)  { if  ( oConvertUtils. isEmpty ( familyName)  ||  oConvertUtils. isEmpty ( firstName) )  { return  "" ; } return  chineseName ( familyName +  firstName) ; } private  static  String  idCardNum ( String  id)  { if  ( oConvertUtils. isEmpty ( id) )  { return  "" ; } return  formatLeft ( id,  4 ) ; } private  static  String  fixedPhone ( String  num)  { if  ( oConvertUtils. isEmpty ( num) )  { return  "" ; } return  formatLeft ( num,  4 ) ; } private  static  String  mobilePhone ( String  num)  { if  ( oConvertUtils. isEmpty ( num) )  { return  "" ; } int  len =  num. length ( ) ; if ( len< 11 ) { return  num; } return  formatBetween ( num,  3 ,  4 ) ; } private  static  String  address ( String  address,  int  sensitiveSize)  { if  ( oConvertUtils. isEmpty ( address) )  { return  "" ; } int  len =  address. length ( ) ; if ( len< sensitiveSize) { return  address; } return  formatRight ( address,  sensitiveSize) ; } private  static  String  email ( String  email)  { if  ( oConvertUtils. isEmpty ( email) )  { return  "" ; } int  index =  email. indexOf ( "@" ) ; if  ( index <=  1 ) { return  email; } String  begin =  email. substring ( 0 ,  1 ) ; String  end =  email. substring ( index) ; String  stars =  "**" ; return  begin +  stars +  end; } private  static  String  bankCard ( String  cardNum)  { if  ( oConvertUtils. isEmpty ( cardNum) )  { return  "" ; } return  formatBetween ( cardNum,  6 ,  4 ) ; } private  static  String  cnapsCode ( String  code)  { if  ( oConvertUtils. isEmpty ( code) )  { return  "" ; } return  formatRight ( code,  2 ) ; } private  static  String  formatRight ( String  str,  int  reservedLength) { String  name =  str. substring ( 0 ,  reservedLength) ; String  stars =  String . join ( "" ,  Collections . nCopies ( str. length ( ) - reservedLength,  "*" ) ) ; return  name +  stars; } private  static  String  formatLeft ( String  str,  int  reservedLength) { int  len =  str. length ( ) ; String  show =  str. substring ( len- reservedLength) ; String  stars =  String . join ( "" ,  Collections . nCopies ( len- reservedLength,  "*" ) ) ; return  stars +  show; } private  static  String  formatBetween ( String  str,  int  beginLen,  int  endLen) { int  len =  str. length ( ) ; String  begin =  str. substring ( 0 ,  beginLen) ; String  end =  str. substring ( len- endLen) ; String  stars =  String . join ( "" ,  Collections . nCopies ( len- beginLen- endLen,  "*" ) ) ; return  begin +  stars +  end; } }  1-11:SymbolConstant package  com. example. poi. desensitization. utils ; 
public  class  SymbolConstant  { public  static  final  String  SPOT  =  "." ; public  static  final  String  DOUBLE_BACKSLASH  =  "\\" ; public  static  final  String  COLON  =  ":" ; public  static  final  String  COMMA  =  "," ; public  static  final  String  LEFT_CURLY_BRACKET  =  "{" ; public  static  final  String  RIGHT_CURLY_BRACKET  =  "}" ; public  static  final  String  WELL_NUMBER  =  "#" ; public  static  final  String  SINGLE_SLASH  =  "/" ; public  static  final  String  DOUBLE_SLASH  =  "//" ; public  static  final  String  EXCLAMATORY_MARK  =  "!" ; public  static  final  String  UNDERLINE  =  "_" ; public  static  final  String  SINGLE_QUOTATION_MARK  =  "'" ; public  static  final  String  ASTERISK  =  "*" ; public  static  final  String  PERCENT_SIGN  =  "%" ; public  static  final  String  DOLLAR  =  "$" ; public  static  final  String  AND  =  "&" ; public  static  final  String  SPOT_SINGLE_SLASH  =  "../" ; public  static  final  String  SPOT_DOUBLE_BACKSLASH  =  "..\\" ; public  static  final  String  SYS_VAR_PREFIX  =  "#{" ; public  static  final  String  DOUBLE_LEFT_CURLY_BRACKET  =  "{{" ; public  static  final  String  SQUARE_BRACKETS_LEFT  =  "[" ; public  static  final  String  SQUARE_BRACKETS_RIGHT  =  "]" ; } 
 2:必须导入的POM的依赖 < dependency> < groupId> </ groupId> < artifactId> </ artifactId> < version> </ version> </ dependency> < dependency> < groupId> </ groupId> < artifactId> </ artifactId> < version> </ version> </ dependency> < dependency> < groupId> </ groupId> < artifactId> </ artifactId> < version> </ version> </ dependency>