package com.learn.aop;
import com.learn.emun.LimitType;
import com.learn.exception.BusinessException;
import com.learn.util.IpUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
/**
* @author linMou
* @Description:
* @Date: 2022/5/25 10:46
* @Version: 1.0
*/
@Aspect
@Component
public class RateLimiterAspect {
private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class);
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@Autowired
private RedisScript<Long> limitScript;
@Before(("@annotation(rateLimiter)"))
public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable {
String key = rateLimiter.key();
int time = rateLimiter.time();
int count = rateLimiter.count();
Object combineKey = getCombineKey(rateLimiter,point);
List<Object> keys = Collections.singletonList(combineKey);
try {
Long number = redisTemplate.execute(limitScript, keys, count, time);
if (number==null || number.intValue() > count) {
throw new BusinessException("访问过于频繁,请稍候再试");
}
log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key);
} catch (BusinessException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException("服务器限流异常,请稍候再试");
}
}
public String getCombineKey(RateLimiter rateLimiter,JoinPoint point) {
StringBuffer stringBuffer = new StringBuffer();
if(rateLimiter.limitType() == LimitType.IP) {
stringBuffer.append(IpUtil.getIpAddr(((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest())).append("-");
}
MethodSignature signature = (MethodSignature)point.getSignature();
Method method = signature.getMethod();
Class<?> targetClass = method.getDeclaringClass();
stringBuffer.append(targetClass.getName()).append("-").append(method.getName());
return stringBuffer.toString();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo;
资源推荐
资源详情
资源评论
收起资源包目录
接口限流demo.zip (20个子文件)
jieKouXianLiu
HELP.md 429B
mvnw.cmd 7KB
pom.xml 2KB
src
test
java
com
learn
LearnApplicationTests.java 209B
main
resources
lua
limit.lua 341B
application.yml 53B
java
com
learn
controller
HelloController.java 564B
LearnApplication.java 312B
exception
BusinessException.java 557B
aop
RateLimiter.java 868B
RateLimiterAspect.java 3KB
emun
LimitType.java 278B
util
IpUtil.java 1KB
config
GlobalException.java 713B
RedisConfig.java 2KB
.mvn
wrapper
maven-wrapper.properties 233B
maven-wrapper.jar 57KB
jieKouXianLiu.iml 10KB
mvnw 10KB
.gitignore 395B
共 20 条
- 1
资源评论
一枚猿人
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C#ASP.NET大型制造业进销存管理系统源码数据库 SQL2008源码类型 WebForm
- liunx project 2
- (源码)基于ROS框架的智能无人机作业系统.zip
- 网页打包封装器V1.0支持苹果IOS/安卓/分发打包
- (源码)基于BERT的KBQA问答系统.zip
- (源码)基于Java和Python的笔声语音识别系统.zip
- 网络安全基础实验1-使用python中cryptography库进行对称加密和解密实验
- Python数电的课程设计网络同步时钟.zip
- (源码)基于Arduino的天文数据库管理系统.zip
- C#餐饮管理系统源码 触摸屏餐饮管理系统源码数据库 SQL2008源码类型 WinForm
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功