注意:這種方式需要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;
}
}
}