zsw-farm
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

91 lines
3.4 KiB

///**
// * Copyright (C) 2018-2022
// * All rights reserved, Designed By www.yixiang.co
//
// */
//package co.yixiang.aspect;
//
//import co.yixiang.annotation.Limit;
//import co.yixiang.exception.BadLimitRequestException;
//import cn.iocoder.yudao.framework.common.exception.ShopException;
//import co.yixiang.utils.RequestHolder;
//import co.yixiang.utils.StringUtils;
//import com.google.common.collect.ImmutableList;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.script.DefaultRedisScript;
//import org.springframework.data.redis.core.script.RedisScript;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//
///**
// * @author /
// */
//@Aspect
//@Component
//public class LimitAspect {
//
// private final RedisTemplate<Object,Object> redisTemplate;
// private static final Logger logger = LoggerFactory.getLogger(LimitAspect.class);
//
// public LimitAspect(RedisTemplate<Object,Object> redisTemplate) {
// this.redisTemplate = redisTemplate;
// }
//
// @Pointcut("@annotation(co.yixiang.annotation.Limit)")
// public void pointcut() {
// }
//
// @Around("pointcut()")
// public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// HttpServletRequest request = RequestHolder.getHttpServletRequest();
// MethodSignature signature = (MethodSignature) joinPoint.getSignature();
// Method signatureMethod = signature.getMethod();
// Limit limit = signatureMethod.getAnnotation(Limit.class);
// LimitType limitType = limit.limitType();
// String key = limit.key();
// if (StringUtils.isEmpty(key)) {
// if (limitType == LimitType.IP) {
// key = StringUtils.getIp(request);
// } else {
// key = signatureMethod.getName();
// }
// }
//
// ImmutableList<Object> keys = ImmutableList.of(StringUtils.join(limit.prefix(), "_", key, "_", request.getRequestURI().replaceAll("/","_")));
//
// String luaScript = buildLuaScript();
// RedisScript<Number> redisScript = new DefaultRedisScript<>(luaScript, Number.class);
// Number count = redisTemplate.execute(redisScript, keys, limit.count(), limit.period());
// if (null != count && count.intValue() <= limit.count()) {
// logger.info("第{}次访问key为 {},描述为 [{}] 的接口", count, keys, limit.name());
// return joinPoint.proceed();
// } else {
// throw new BadLimitRequestException("访问次数受限制");
// }
// }
//
// /**
// * 限流脚本
// */
// private String buildLuaScript() {
// return "local c" +
// "\nc = redis.call('get',KEYS[1])" +
// "\nif c and tonumber(c) > tonumber(ARGV[1]) then" +
// "\nreturn c;" +
// "\nend" +
// "\nc = redis.call('incr',KEYS[1])" +
// "\nif tonumber(c) == 1 then" +
// "\nredis.call('expire',KEYS[1],ARGV[2])" +
// "\nend" +
// "\nreturn c;";
// }
//}