注意:这种方式须要JDK1.8版本支持java
开始:web
1.aop配置:
<aop:aspectj-autoproxy expose-proxy="true" />
spring
- 注意该配置须要配置在spring mvc的配置文件中,由于须要拦截controller层方法
- 或者在必需要配置在spring配置文件中的状况下,同时须要拦截controller层的方法,能够在spring配置文件中加入controller层的包扫描
2.具体代码:apache
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; } } }