注意:这种方式需要JDK1.8版本支持
开始:http://www.cnblogs.com/wing7319/p/9592184.html
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; } } }