pointcut获取不到ajax参数,Spring aop: 如何在增強方法中獲取並修改目標函數的參數...

總結網上的方法,自己實驗了一下,目標函數如下:

@RequestMapping(value="/dispatch",produces = "text/html; charset=UTF-8")

@ResponseBody

@ControllerPointcut(str= "OKOK")public String dispatch(@RequestParam("messageA") String messageA,

@RequestParam("messageB") String messageB,

@RequestParam("messageC") String messageC)throws Exception{return "alert('"+messageA+messageB+messageC+"');";

}

增強方法:

@Pointcut("@annotation(com.annotation.ControllerPointcut)")private voidcontroller(){}

@Around("controller()")publicObject test(ProceedingJoinPoint pjp) throws Throwable{

Object[] args=pjp.getArgs();for(Object obj : args){

System.out.println("arguments:"+obj);

}

Object args0= args[0];

Object args2= args[2];

args[0] =args2;

args[2] =args0;

Object retVal=pjp.proceed(args);returnretVal;

}

頁面ajax:

$.ajax({

url:"test/dispatch.do",

type:"post",

dataType:"html",

data:{messageA:"This", messageB:"Is", messageC:"Message"},

success:function(result){

$("#container-top").append(result);

}

});

結果:

頁面:

MessageIsThis

Eclipse控制台:

arguments: This

arguments: Is

arguments: Message

總結:

1.ProceedingJoinPoint對象取到的args[]內的 參數順序 就是 目標函數聲明時的參數順序,可以逐一對應

2.直接通過 args[‘index’] = ...  方式來修改,再通過 Object retVal = pjp.proceed(args); return retVal;即可改變並傳入參數;

3.如果對象方法的參數中包括 HttpServletRequest request, 那么直接調用其getParameterMap().put(...)方法改變Parameter會報錯“parameterMap is locked”,而其set相關的方法又只有setAttribute,即設置用於多個controller方法跳轉的attribute,就算設置成某parameter相同的名字,也無法覆蓋,畢竟是不一樣的對象。所以,通過截獲request本身來改變參數的方法行不通。

4.另外還有在聲明@annotation時,加入args(..) 這樣的方法可以直接截獲目標函數的參數,但,暫時不知道,如何只通過這個方法修改參數並傳回目標函數。。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值