總結網上的方法,自己實驗了一下,目標函數如下:
@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 "<script>alert('"+messageA+messageB+messageC+"');</script>"; }
增強方法:
@Pointcut("@annotation(com.annotation.ControllerPointcut)") private void controller(){} @Around("controller()") public Object 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); return retVal; }
頁面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(..) 這樣的方法可以直接截獲目標函數的參數,但,暫時不知道,如何只通過這個方法修改參數並傳回目標函數。。。。