首页>代码>springboot+mybatis-plus框架实现java web项目公共图片上传接口(图片服务器)>/imgserver/src/main/java/com/npf/imgserver/aspect/RateLimitAop.java
package com.npf.imgserver.aspect;

import com.google.common.util.concurrent.RateLimiter;
import com.npf.imgserver.common.base.ResultBase;
import com.npf.imgserver.common.enums.ResultCodeEnum;
import com.npf.imgserver.utils.JsonUtil;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
@Scope
@Aspect
public class RateLimitAop {

    public static final Logger logger = LoggerFactory.getLogger(RateLimitAop.class);

    @Autowired
    private HttpServletResponse response;

    //秒并发限制 50/s
    private RateLimiter rateLimiter = RateLimiter.create(50.0);

    @Pointcut("@annotation(com.npf.imgserver.aspect.RateLimitAspect)")
    public void serviceLimit() {

    }

    @Around("serviceLimit()")
    public Object around(ProceedingJoinPoint joinPoint) {
        Boolean flag = rateLimiter.tryAcquire();
        Object obj = null;
        try {
            if (flag) {
                obj = joinPoint.proceed();
            } else {
                ResultBase resultBase = new ResultBase(ResultCodeEnum.RATE_LIMIT_WARN);
                String result = JsonUtil.object2json(resultBase);
                output(response, result);
            }
        } catch (Throwable e) {
            logger.error("限流信息输出异常", e);
        }
        return obj;
    }

    /**
     * 限流信息输出
     *
     * @param response
     * @param msg
     * @throws IOException
     */
    public void output(HttpServletResponse response, String msg) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            outputStream.write(msg.getBytes("UTF-8"));
        } catch (IOException e) {
            logger.error("限流信息IO异常", e);
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }
}
最近下载更多
lcqlcl  LV11 2023年8月29日
lds85930  LV11 2023年3月2日
qdhpzx  LV1 2023年2月12日
gzxh8888  LV2 2022年3月6日
zoujialuo  LV9 2021年11月22日
小资李  LV13 2021年6月22日
王晓波  LV16 2021年4月28日
sky12a  LV7 2020年12月3日
zhugc111  LV10 2020年11月8日
sinbero  LV8 2020年8月10日
最近浏览更多
hongdongdong  LV14 4月26日
漫步的海星  LV4 2023年9月21日
lcqlcl  LV11 2023年8月29日
lds85930  LV11 2023年3月2日
qdhpzx  LV1 2023年2月12日
ゆ 、 Hurt°  LV2 2022年8月25日
mwh1001  LV15 2022年7月7日
denliv_hui  LV13 2022年4月5日
crosa_Don  LV18 2022年4月1日
zhy1989wz  LV6 2022年3月15日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友