我正在使用BaseRepository
内的search
方法,根据给定的搜索条件返回列表。我为此使用休眠查询。该列表中的某些值将被加密。所以我想在使用春季 AOP 返回之前更改该列表。以下代码中的returnList
包含我使用 AOP 访问的搜索结果list
。如果字符串已加密,我正在使用解密方法对该列表中的字符串进行解密。但是我如何在以下代码中进行更改以反映在搜索的确切结果中。我的意思是,在Aspect上进行的解密将如何反映在原始列表中。
@Aspect
@Service
public class DecryptionAspect {
@AfterReturning(value="(execution(* search(..)) )" +
"&& target(com.erp.core.repo.IBaseRepository) " +
"&& args(..)",returning="returnList")
public void decrypt(List returnList) throws Exception
{
Iterator itr = returnList.iterator();
while(itr.hasNext()){
Object[] obj = (Object[]) itr.next();
for(int i=0;i<obj.length;i++){
if(obj[i]!=null)
EncryptUtil.decrypt(obj[i].toString());
}
}
}
}
假设所有字符串都需要解密,您可以更改列表中包含的数组:
@AfterReturning(value="(execution(* search(..)) )" +
"&& target(com.erp.core.repo.IBaseRepository) " +
"&& args(..)",returning="returnList")
public void decrypt(List returnList) throws Exception
{
for (Object [] objs : (List<Object[]>) returnList) {
for (int i = 0; i < objs.length; i++) {
if (objs[i] instanceof String) {
objs[i]= EncryptUtil.decrypt(objs[i]);
}
}
}
}
您可以尝试替换列表"returnList"中的元素。
@AfterReturning(value="(execution(* search(..)) )" +
"&& target(com.erp.core.repo.IBaseRepository) " +
"&& args(..)",returning="returnList")
public void decrypt(List returnList) throws Exception
{
Iterator itr = returnList.iterator();
int count=0;
while(itr.hasNext()){
Object[] obj = (Object[]) itr.next();
Object[] newObjects = new Object[obj.length];
for(int i=0;i<obj.length;i++){
if(obj[i]!=null)
String decryptedText = EncryptUtil.decrypt(obj[i].toString());
newObjects[i] = decryptedText;
}
returnList.set(count,newObjects);
count++;
}
}