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

时间: 2024-10-10 07:29:19

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

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob

Spring AOP 切面编程的方法

spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring aop 2.基于配置文件实现spring aop 3.增强的分类 4.切点表达式的构成 1.基于注解来实现的方法 基于注解并不意味着不需要配置文件,只不过是在配置文件中所需要的配置很少.切面编程,显然我们需要一个增强类,一个被增强的普通类. 配置文件中需要添加以下的内容 xmlns:aop="ht

spring AOP切面日志 拦截方法中有同名方法问题

代码: @ResponseBody @RequestMapping("/login.do") public Json login(SysUserPM sysUserPM, HttpSession session) { Json j = new Json(); SysUserPM sysUser = sysUserServiceI.doLogin(sysUserPM); if (sysUser != null) { System.out.println("后台用户登录成功!&q

spring aop之对象内部方法间的嵌套失效

spring aop之对象内部方法间的嵌套失效 先看一下spring 代理原理: *       spring代理嵌套方法调用不生效 * *       Spring AOP defaults to using standard JDK dynamic proxies for AOP *       proxies. This enables any interface (or set of interfaces) to be *       proxied. * *       Spring

如何在onCreate方法中获取视图的宽度和高度

你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当onCreate被调用的时候,视图的内容正在被LayoutInflater来填充xml布局. 这个过程会填充布局,但是暂时不会设置视图的大小. 那么视图到底什么时候获得自己的大小尺寸呢? 实际上是在Layout以后,而layout又是在onCreate调用以后. 那么,如果我们要在onCreate方

MVC 在action方法中获取当前action的控制器名和action名

如何在某个action方法中获取它所在的控制器和action名称呢. string controllerName = Request.RequestContext.RouteData.Values["controller"].ToString();//获取控制器名 string actionName = Request.RequestContext.RouteData.Values["action"].ToString();//获取action名

HackThirteen 在onCreate()方法中获取View的宽度和高度

1.概要: Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出: 如果开发一些依赖于UI控件的宽和高的功能,开发者可能会用到View的getHeight()和getWidth()方法.试图在Activity的 onCreate()方法中获取控件的宽和高.遗憾的是如果开发者在onCreate()方法中调用上述方法,会发现返回值都是0. 3.解释问题原因: 当onCreate()方法被调用时,会通过LayoutInfla

Spring中的AOP——在Advice方法中获取目标方法的参数(转)

获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Object getTarget:返回被织入增强处理的目标对象 Object getThis:返回AOP框架为目标对象生成的代理对象 注意:当使

Spring学习之Aop的各种增强方法

AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的编译器或者织入器,底层依然使用SpringAOP来实现,依然是在运行时动态生成AOP代理,因此不需要增加额外的编译,也不需要AspectJ的织入器支持.而AspectJ采用编译时增强,所以AspectJ需要使用自己的编译器来编译Java文件,还需要织入器. 为了启用Spring对@AspectJ切面