1、創建注解、添加屬性。
例:接口訪問時間段限制
package com.yhsp.payapi.aspect; import javax.validation.Payload; import java.lang.annotation.*; /** * @author guocz * @date 20211129 * 接口訪問時間限制 */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface AccessTime { String message() default "當前時間不允許訪問"; /** * 數據字典key(每一天:HH:mm:ss) */ String bizKey() default ""; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; }
2、創建注解實現類,采用切面。
使用切點@Pointcut("@annotation(com.yhsp.payapi.aspect.AccessTime)")綁定注解類。
使用@Before("pointcut() && @annotation(accessTime)")確定切入點為訪問接口前。
並使用@annotation(accessTime)傳遞注解屬性。
package com.yhsp.payapi.aspect.impl; import cn.hutool.core.date.LocalDateTimeUtil; import com.yhsp.pay.common.exception.CustomException; import com.yhsp.pay.common.result.pay.ApiCode; import com.yhsp.pay.common.result.pay.ApiSubCode; import com.yhsp.pay.core.utils.DictionaryUtil; import com.yhsp.payapi.aspect.AccessTime; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * @author guocz * @date 20211129 * 接口訪問時間限制 */ @Aspect @Component @Log4j2 public class AccessTimeValidator { @Pointcut("@annotation(com.yhsp.payapi.aspect.AccessTime)") private void pointcut() { } @Before("pointcut() && @annotation(accessTime)") public void before(AccessTime accessTime) { String bizKey = accessTime.bizKey(); if (StringUtils.isBlank(bizKey)) { return; } // 獲取數據字典值 String timeString = DictionaryUtil.fetchData(bizKey, String.class); if (StringUtils.isBlank(timeString)) { log.error("key為" + bizKey + "的數據字典未配置"); throw new CustomException(ApiCode.BIZ_FAIL, ApiSubCode.BIZ_FAIL_DICTIONARY_NOT_EXIST); } String[] strings = timeString.split(","); LocalDateTime now = LocalDateTime.now(); String ymd = LocalDateTimeUtil.format(now, "yyyy-MM-dd"); // 起始時間(HH:mm:ss) LocalDateTime timeBegin; // 終止時間(HH:mm:ss) LocalDateTime timeEnd; try { timeBegin = LocalDateTimeUtil.parse(ymd + " " + strings[0], "yyyy-MM-dd HH:mm:ss"); timeEnd = LocalDateTimeUtil.parse(ymd + " " + strings[1], "yyyy-MM-dd HH:mm:ss"); }catch (Exception e) { log.error("key為" + bizKey + "的時間格式配置有誤"); throw new CustomException(ApiCode.BIZ_FAIL, ApiSubCode.ERROR_CONFIG_ERROR); } if (now.isBefore(timeBegin) || now.isAfter(timeEnd)) { log.warn("key為" + bizKey + "當前時間不允許訪問"); throw new CustomException(ApiCode.ERROR, ApiSubCode.ERROR_ACCESS_ERROR, accessTime.message()); } } }
3、如果需要獲取入參等信息,可在切面方法中添加JoinPoint參數。
JoinPoint使用方法可參考:https://blog.csdn.net/qq_15037231/article/details/80624064
package com.yhsp.payapi.aspect; import com.yhsp.pay.common.utils.AspectUtil; import com.yhsp.pay.gateway.utils.OpenApiSignUtil; import com.yhsp.pay.model.param.OpenApiBaseParam; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Aspect @Component public class OpenApiSignVerifyAspect { @Autowired private OpenApiSignUtil openApiSignUtil; @Autowired private AspectUtil aspectUtil; @Pointcut("@annotation(com.yhsp.payapi.aspect.OpenApiSignVerify)") private void pointcut() { } @Before("pointcut() && @annotation(signVerify)") public void before(JoinPoint joinPoint, OpenApiSignVerify signVerify) { OpenApiBaseParam param = (OpenApiBaseParam) aspectUtil.getFieldsName(joinPoint).get("param"); openApiSignUtil.verifySign(param); } }