package com.jiayue.ssi.util;

import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

/**
* 接口访问限制工具类
*
* @author xsl
* @since 2023/02/24
*/
public class InterfaceLimitUtil {
    private static ConcurrentHashMap<String, ExpiringMap<String, Integer>> interfaceLimitMap = new ConcurrentHashMap<>();

    /**
     * 接口检测*
     * @param request
     * @param time 限制时间 单位：毫秒
     * @param value 允许请求的次数
     * @return boolean true:允许通过 false:不通过
     */
    public synchronized static boolean checkInterface(HttpServletRequest request,long time,int value){
        ExpiringMap<String, Integer> uc = interfaceLimitMap.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build());
        Integer uCount = uc.getOrDefault(IPUtils.getIpAddr(request), 0);
        if (uCount >= value) { // 超过次数，不执行目标方法
            return false;
        } else if (uCount == 0) { // 第一次请求时，设置有效时间
            uc.put(IPUtils.getIpAddr(request), uCount + 1, ExpirationPolicy.CREATED, time, TimeUnit.MILLISECONDS);
        } else { // 未超过次数， 记录加一
            uc.put(IPUtils.getIpAddr(request), uCount + 1);
        }
        interfaceLimitMap.put(request.getRequestURI(), uc);
        return true;
    }
}
