java注解-驗簽、日志、攔截(切面)


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);
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM