aop对请求后端的参数修改_Spring Aop 修改目标方法参数和返回值

@Component("changeIdNoAopHandler")public classChangeIdNoAopHandler {private static Logger logger = LoggerFactory.getLogger(ChangeIdNoAopHandler.class);private static final String SECRET_KEY = "12345678"; //秘钥

private String HANDLE_FIELD_NAME = "idNo"; //加密解密字段

private static final String ENCRYPT_FLAG = "encrypt"; //加密标识 (判断对值进行加密或者解密的操作)

private static final String DECRYPT_FLAG = "decrypt"; //解密标识(判断对值进行加密或者解密的操作)

@AutowiredprivateInetxValDualService netxValDualService;

@AutowiredprivateIThemisCryptoIdnoService themisCryptoIdnoService;/***

*

* @Description(功能描述) : 切面方法 (修改目标方法参数中带有 idNo字段的值;修改目标方法返回值带有idNo的字段)

*@author(作者) :

* @date (开发日期) : 2017-9-13 下午5:30:24

*@exception:

*@paramjoinPoint

*@return*@throwsThrowable Object*/

public Object parameterCheck(ProceedingJoinPoint joinPoint) throwsThrowable{

logger.info("开始执行aop方法修改参数。。。");

Object target= joinPoint.getTarget();//返回被织入增强处理的目标对象 getThis:返回AOP框架为目标对象生成的代理对象

Object[] args = joinPoint.getArgs(); //获取目标对象方法参数//遍历参数 修改带有idNo字段对象的值 (map list domain)

for(Object _obj : args) {try{

changValue(_obj,ENCRYPT_FLAG);//加密参数

}catch (Exception e) { //使用异常机制来验证 _obj中 是否有idNo 字段

logger.error("修改目标方法参数字段值异常。目标类:"

+target.getClass()+"方法:"+joinPoint.getSignature().getName()+"修改的值:"+_obj,e);

}

}//执行方法,以新的参数(如果不带args就是用原先的参数;这里带不带都可以是,上面方法获取原先参数的引用做的修改)

Object returnValue =joinPoint.proceed(args);//若未设置,则不需要解密

if(!ObjectIsNullUtil.isNullOrEmpty(returnValue)){try{//修改

returnValue = changValue(returnValue,DECRYPT_FLAG); //解密参数

}catch (Exception e) { //使用异常机制来验证 _obj中 是否有idNo 字段

logger.error("修改目标方法返回值异常。目标类:"

+target.getClass()+"方法:"+joinPoint.getSignature().getName()+"修改的值:"+returnValue,e);

}

}returnreturnValue;

}/***

*

* @Description(功能描述) : 修改对象idNo字段的值

*@author(作者) :

* @date (开发日期) : 2017-9-13 下午5:30:07

*@exception:

*@param_obj

*@paramflag 加密解密字段

*@throwsException void*/

private Object changValue(Object _obj, String flag) throwsException{//基本类型不作操作

if(_obj instanceofMap){

changeMapValue(_obj,flag);

}else if(_obj instanceofList){

@SuppressWarnings("unchecked")

List list = (List) _obj;for(Object obj : list) {if(obj instanceofMap){

changeMapValue(_obj,flag);

}else{

changObjectValue(_obj,flag);

}

}

}else{

changObjectValue(_obj,flag);

}return_obj;

}/***

* @Description(功能描述) : 当对象为Map 修改key的值

*@author(作者) : 吴桂镇

* @date (开发日期) : 2017-9-14 上午11:17:50

*@exception:

*@param_obj

*@paramflag

*@returnObject

*@throwsException*/@SuppressWarnings("unchecked")private Object changeMapValue(Object _obj, String flag) throwsException{

Map map = (Map) _obj;if(map.containsKey(HANDLE_FIELD_NAME)){

Object fieldValue=map.get(HANDLE_FIELD_NAME);

String afterValue=crypto(fieldValue, flag);if(!ObjectIsNullUtil.isNullOrEmpty(afterValue)){

map.put(HANDLE_FIELD_NAME, afterValue);

}

}return_obj;

}/***

*

* @Description(功能描述) : 修改Object对象field的值

*@author(作者) :

* @date (开发日期) : 2017-9-14 上午11:37:07

*@exception:

*@param_obj

*@paramflag

*@return*@throwsException Object*/

private Object changObjectValue(Object _obj, String flag) throwsException{

Class> resultClz =_obj.getClass();

Field[] fieldInfo= resultClz.getDeclaredFields(); //获取class里的所有字段 父类字段获取不到 注:如果出现加密解密失败 请先查看idno是否在父类中

for(Field field : fieldInfo) {if(HANDLE_FIELD_NAME.equals(field.getName())){

field.setAccessible(true); //成员变量为private,故必须进行此操

Object fieldValue =field.get(_obj);

String afterValue=crypto(fieldValue, flag);if(!ObjectIsNullUtil.isNullOrEmpty(afterValue)){

field.set(_obj, afterValue);

}break;

}

}return_obj;

}/***

*

* @Description(功能描述) : 加密操作

*@author(作者) :

* @date (开发日期) : 2017-9-14 下午3:20:32

*@exception:

*@paramvalue

*@paramflag

*@returnString

*@throwsException*/

private String crypto(Object value,String flag) throwsException{if(ObjectIsNullUtil.isNullOrEmpty(value)){return null;

}//加密操作;加密之前先去查询一下数据库 有没有 如果没有 则insert

if(ENCRYPT_FLAG.equals(flag)) {

String encodeValue= Encryption.encode(SECRET_KEY, value.toString()); //加密

ThemisCryptoIdno idnoDomain = newThemisCryptoIdno();

idnoDomain.setCryptoIdno(encodeValue);

idnoDomain=themisCryptoIdnoService.selectOneByObject(idnoDomain);if(ObjectIsNullUtil.isNullOrEmpty(idnoDomain)){ //若空 则生成 seq 然后入库 返回seq

String tr_date =DateOperation.convertToDateStr2(DateOperation.currentTimeMills());//获取有流水号

String inextValDual=netxValDualService.findIdNoSeq();//组流水:日期+ 7位流水 其他表储存的就是这个idnoSeq

String idnoSeq=(tr_date+DateOperation.fill(inextValDual, '0', 7, true)).replaceAll("-", "");

idnoDomain= newThemisCryptoIdno();

idnoDomain.setOptTime(DateOperation.convertToDateStr1(DateOperation.currentTimeMills()));

idnoDomain.setCryptoIdno(encodeValue);

idnoDomain.setCryptoSeq(idnoSeq);

themisCryptoIdnoService.insert(idnoDomain);returnidnoSeq;

}else{ //不为空 直接返回seq

returnidnoDomain.getCryptoSeq();

}

}else{ //解密操作 通过seq 查询 然后解密返回明文

ThemisCryptoIdno idnoDomain = newThemisCryptoIdno();

idnoDomain.setCryptoSeq(value.toString());

idnoDomain=themisCryptoIdnoService.selectOneByObject(idnoDomain);if(!ObjectIsNullUtil.isNullOrEmpty(idnoDomain)){return Encryption.decodeValue(SECRET_KEY, idnoDomain.getCryptoIdno()); //解密

}

}return null;

}public static void main(String[] args) throwsException {

System.out.println(Encryption.encode(SECRET_KEY,"142701197605091275"));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值