总结网上的方法,自己实验了一下,目标函数如下:
@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(..) 这样的方法可以直接截获目标函数的参数,但,暂时不知道,如何只通过这个方法修改参数并传回目标函数。。。。
时间: 2024-10-10 07:29:19