Spring aop: 如何在增强方法中获取并修改目标函数的参数

来源:互联网 发布:java链式编程 编辑:程序博客网 时间:2024/05/22 05:27
@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: Thisarguments: Isarguments: 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