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 "<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(..) 这样的方法可以直接截获目标函数的参数,但,暂时不知道,如何只通过这个方法修改参数并传回目标函数。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值