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

Posted ajjiangxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(..) 这样的方法可以直接截获目标函数的参数,但,暂时不知道,如何只通过这个方法修改参数并传回目标函数。。。。

 

以上是关于Spring aop: 如何在增强方法中获取并修改目标函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

spring笔记3-AOP

环绕增强

Spring框架学习——AOP的开发

Spring中的AOP 知识点

浅谈spring中AOP以及spring中AOP的注解方式

spring03-aop