日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2025/3/20 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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"));

}

}

總結

以上是生活随笔為你收集整理的aop对请求后端的参数修改_Spring Aop 修改目标方法参数和返回值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。