通过@Aspect切面自定义注解

本文展示了如何通过Spring AOP和自定义注解`@SignCheck`来实现在方法调用前对参数进行加密签名的验证。代码中定义了切点和环绕通知,检查请求头中的签名是否与生成的签名一致,并进行了接口过期时间的校验,确保接口安全。
摘要由CSDN通过智能技术生成

一种通过切面编程来自定义注解,以下代码demo是通过自定义注解对加密参数进行验证的过程,不用关心代码的业务过程,直接看通过@Aspect是如何自定义注解的,有了以下代码,springboot工程中的主类还需要加

@EnableAspectJAutoProxy 注解

直接看代码:

@Documented
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SignCheck {

}

@Slf4j
@Aspect
@Configuration
public class SignCheckAspect {
    private String secret = "123123";
    private Long expire = (1000 * 60) * 2L;

    // 定义切点方法
    @Pointcut("@annotation(com.ecej.ecejcomponents.basic.anotation.SignCheck)")
    public void pointCut() {
    }

    @Around("pointCut()")
    public void around(ProceedingJoinPoint joinPoint) {
        String signStr = RequestUtils.getHeader("sign");
        // 拦截的类名
        Class clazz = joinPoint.getTarget().getClass();
        // 拦截的方法
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

        SignCheck annotation = method.getAnnotation(SignCheck.class);
        if (annotation != null) {
            log.info("类:" + clazz + " 方法:" + method + " 获取到注解");
        }
        Object[] values = joinPoint.getArgs();
        if (values.length == 0) {
            return;
        }
        //目前只支持post请求
        Object vo = values[0];
        Map<String, Object> map = BeanUtil.beanToMap(vo);
        String paramSign = ParamsEncodeUtil.createSign(map, secret);
        if (!signStr.equals(paramSign)) {
            ExceptionUtils.throwBusinessException(ResultCodeEnum.MARKETING_INTERFACE_AUTH_FAIL_ERROR);
        }
        checkExpire(map.get("timestamp"));
    }

    //接口过期时间校验
    public void checkExpire(Object timestamp) {
        long signTime = Long.parseLong(timestamp.toString());
        long nowTime = System.currentTimeMillis();
        long mx = nowTime - signTime;
        if (mx > expire) {
            ExceptionUtils.throwBusinessException(ResultCodeEnum.MARKETING_INTERFACE_AUTH_EXPIRE_ERROR);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荆茗Scaler

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值