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

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


 

开始:http://www.cnblogs.com/wing7319/p/9592184.html

1.aop配置: 

  • 注意该配置需要配置在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.效果:

Spring AOP获取拦截方法的参数名称跟参数值_第1张图片

你可能感兴趣的:(Spring AOP获取拦截方法的参数名称跟参数值)