Spring AOP获取拦截方法的参数名称跟参数值

Spring AOP获取拦截方法的参数名称跟参数值

注意:这种方式需要JDK1.8版本支持



开始:

1.aop配置: <aop:aspectj-autoproxy expose-proxy="true" />

  • 注意该配置需要配置在spring mvc的配置文件中,因为需要拦截controller层方法
  • 或者在必须要配置在spring配置文件中的情况下,同时需要拦截controller层的方法,可以在spring配置文件中加入controller层的包扫描

2.具体代码:


import org.apache.commons.lang3.ArrayUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 请求参数拦截校验
 */
@Aspect
public class AopParamVerify {
    private static Logger log = LoggerFactory.getLogger(AopParamVerify.class);

    @Around(value = "execution(* com.website.controller..*.*(..))")
    public Object invoke(ProceedingJoinPoint joinPoint) {

        /**
         * 时间戳校验,超过一分钟,拦截
         */
         //返回结果封装类
        HzlqswReqResult rst = new HzlqswReqResult();
        //1.这里获取到所有的参数值的数组
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        //2.最关键的一步:通过这获取到方法的所有参数名称的字符串数组
        String[] parameterNames = methodSignature.getParameterNames();
        try {
            //3.通过你需要获取的参数名称的下标获取到对应的值
            int timeStampIndex = ArrayUtils.indexOf(parameterNames, "timeStamp");
            if (timeStampIndex != -1) {
                long timeStamp = (Long) args[timeStampIndex];
                if (System.currentTimeMillis() - timeStamp > 60000) {
                    rst.setResultCode(rst.resultCode_hashCode_overdue);
                    rst.setReturnMsg("时间戳过期");
                    rst.setReturnObject("时间戳过期");
                    return rst;
                }
            }
            return joinPoint.proceed();
        } catch (Throwable throwable) {
            log.error("时间戳校验异常");
            throwable.printStackTrace();
            rst.setResultCode(rst.resultCode_error);
            rst.setReturnMsg("AOP校验异常");
            rst.setReturnObject("AOP校验异常");
            return rst;
        }
    }
}

3.效果:

原文地址:https://www.cnblogs.com/wing7319/p/9592184.html

时间: 2024-10-07 09:24:20

Spring AOP获取拦截方法的参数名称跟参数值的相关文章

Spring AOP 获取拦截的泛型方法

拦截泛型方法时,如果采用如下风格的代码会报错java.lang.NoSuchMethodException,: Method methodArr = joinPoint.getSignature().getDeclaringType().getMethod(methodName, parameterTypes); 因为泛型方法所在的类里没有具体参数的方法... 不过,可以获取目标类型的所有方法根据方法名称依次匹配:这样就可以在拦截的方法上加上自定义注解信息,完成特定的业务需求.     /**

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

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

Spring AOP根据JdbcTemplate方法名动态设置数据源

说明:现在的场景是,采用数据库(Mysql)复制(binlog)的方式在两台不同服务器部署并配置主从(Master-Slave)关系: 并需要程序上的数据操作方法来访问不同的数据库,比如,update方法访问主数据库服务器,query方法访问从数据库服务器. 即把"增删改"和"查"分开访问两台服务器,当然两台服务器的数据库同步事先已经配置好. 然而程序是早已完成的使用Spring JdbcTemplate的架构,如何在不修改任何源代码的情况下达到<本文标题&g

Spring Aop 实现拦截器功能之基础 - 001

环绕通知用 @Around  注解来声明 可以决定这个方法在什么时候执行,如何执行,甚至是否执行 通知的第一个参数必须是 ProceedingJoinPoint 类型 如下 @Pointcut("execution(* com.sxb.web.v2.wh.unittest2.aop.PersonServiceBean.save(..)) || execution(* com.sxb.web.v2.wh.unittest2.aop.PersonServiceBean.update(..))&quo

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

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

Spring AOP不拦截从对象内部调用的方法

拦截器的实现原理很简单,就是动态代理,实现AOP机制.当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作. 但是最近在项目中要在一个事务中跨数据源进行操作.数据库跨源就不在这里说了,可以自行百度. 这里出现的问题就是,如果我们要拦截某个类的多个方法,且在该类的方法中使用this调用要拦截的方法时会导致拦截失败. 这样说有点抽象,看一个代码: package com.intsmaze.before; public clas

Spring AOP不拦截从对象内部调用的方法原因

拦截器的实现原理很简单,就是动态代理,实现AOP机制.当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作. 但是最近在项目中要在一个事务中跨数据源进行操作.数据库跨源就不在这里说了,可以自行百度. 这里出现的问题就是,如果我们要拦截某个类的多个方法,且在该类的方法中使用this调用要拦截的方法时会导致拦截失败. 这样说有点抽象,看一个代码: package com.intsmaze.before; public clas

Spring Aop 日志拦截应用

近期,一个小伙伴遇到了此需求.要解决的问题就是: 记录用户在系统的操作,通过注解来灵活控制.  注解可以对方法进行修饰,描述.  后面会将注解上描述以及方法被调用时入参记录到数据库. 同时还需要对不同的操作进行分类(插入,修改,查看,下载/上传文件之类的),记录用户,时间以及IP,客户端User-agent . 我在这里将部分实现写了出来,实际在项目中可以直接参照进行修改就可以满足以上功能. 开发环境:W7 + Tomcat7 + jdk1.7 + Mysql5 框架:spring,spring

Spring Aop、拦截器、过滤器的区别

Filter过滤器:拦截web访问url地址.Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问.Spring AOP拦截器:只能拦截Spring管理Bean的访问(业务层Service)----------------------------------------------------------------------------Spring AOPSpring AOP,是AOP的一种实现,使用的是代理模式.FilterFilter(过滤器)是J2E