短信限制

獲取用戶真實IP地址

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPUtil {

    /**
     * 獲取請求的ip
     *
     * @return
     */
    public static String getIp(HttpServletRequest request) {

        String ipAddress = null;

        ipAddress = request.getHeader("x-forwarded-for");
        if (ipAddress == null || ipAddress.length() == 0
                || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.length() == 0
                || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.length() == 0
                || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
            if (ipAddress.equals("127.0.0.1")) {
                // 根據網卡取本機配置的IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                ipAddress = inet.getHostAddress();
            }

        }
        //對于通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按照','分割
        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
            if(ipAddress.indexOf(",")>0){
                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
            }
        }
        return ipAddress;
    }
}

獲取配置文件屬性值

//application中IP數量限制
@Value("${phone.msg.ip.limit}")
private String ipLimitNum;

//application中系統數量限制
@Value("${phone.msg.sys.limit}")
private String sysLimitNum;

redis目錄設置

//IP地址次數限制key(1自然天10次)
private static final String USER_PHONEMSG_IP_LIMIT = "USER_PHONEMSG_IP_LIMIT" + ":";

//系統次數限制key(1小時內50條)
private static final String USER_PHONEMSG_SYSTEM_LIMIT = "USER_PHONEMSG_SYSTEM_LIMIT" + ":";

判斷當前IP是否達到發送限制

/**
     * 判斷當前IP是否達到發送限制
     *
     * @param ip
     * @return
     */
    public boolean checkIPLimit(String ip) {
        Jedis jedis = jedisPool.getResource();
        Calendar c = Calendar.getInstance();
        //獲取當前幾號
        int datenum = c.get(Calendar.DATE);
        //今天是否有發送記錄
        String value = jedis.get(USER_PHONEMSG_IP_LIMIT + ip + ":" + datenum);
        jedis.close();
        if (StringUtils.isNotBlank(value)) {
            int num = Integer.valueOf(value);
            return num < Integer.valueOf(ipLimitNum) ? true : false;
        } else {
            return true;
        }
    }

判斷當前系統是否達到發送限制

/**
     * 判斷當前系統是否達到發送限制
     *
     * @return
     */
    public boolean checkSysLimit() {
        Jedis jedis = jedisPool.getResource();
        Calendar c = Calendar.getInstance();
        //獲取當前是幾時
        int hournum = c.get(Calendar.HOUR_OF_DAY);
        //當前小時是否有發送記錄
        String value = jedis.get(USER_PHONEMSG_SYSTEM_LIMIT + hournum);
        jedis.close();
        if (StringUtils.isNotBlank(value)) {
            int num = Integer.valueOf(value);
            return num <  Integer.valueOf(sysLimitNum) ? true : false;
        } else {
            return true;
        }
    }

當前IP發送短信數加1

/**
     * 當前IP發送短信數加1
     *
     * @param ip
     * @return
     */
    public void setIPLimit(String ip) {
        Jedis jedis = jedisPool.getResource();
        Calendar c = Calendar.getInstance();
        //獲取當前幾號
        int datenum = c.get(Calendar.DATE);
        String key = USER_PHONEMSG_IP_LIMIT + ip + ":" + datenum;
        //今天是否有發送記錄
        String value = jedis.get(key);
        //更新發送記錄
        if (StringUtils.isNotBlank(value) /*&& Integer.valueOf(value) <  Integer.valueOf(ipLimitNum)*/) {//不需要判斷是否超數
            int num = Integer.valueOf(value);
            //計數加1
            num += 1;
            //獲取上次所剩時間
            int time = Integer.parseInt(String.valueOf(jedis.ttl(key)));
            //此次賦值會使生命周期丟失
            jedis.set(key, String.valueOf(num));
            //延續上次的生命周期
            jedis.expire(key, time);
        } else {
            jedis.set(key, String.valueOf(1));
            //生命周期為60*60*24秒,24小時為間隔,保證業務及釋放
            jedis.expire(key, 60 * 60 * 24);
        }
        jedis.close();
    }

判斷當前系統是否達到發送限制

/**
     * 判斷當前系統是否達到發送限制
     *
     * @return
     */
    public void setSysLimit() {
        Jedis jedis = jedisPool.getResource();
        Calendar c = Calendar.getInstance();
        //獲取當前時刻
        int hournum = c.get(Calendar.HOUR_OF_DAY);
        String key = USER_PHONEMSG_SYSTEM_LIMIT + hournum;
        //當前小時是否有發送記錄
        String value = jedis.get(key);
        //更新發送記錄
        if (StringUtils.isNotBlank(value) /*&& Integer.valueOf(value) <  Integer.valueOf(sysLimitNum)*/) {//不需要判斷是否超數
            int num = Integer.valueOf(value);
            //計數加1
            num += 1;
            //獲取上次所剩時間
            int time = Integer.parseInt(String.valueOf(jedis.ttl(key)));
            //此次賦值會使生命周期丟失
            jedis.set(key, String.valueOf(num));
            //延續上次的生命周期
            jedis.expire(key, time);
        } else {
            jedis.set(key, String.valueOf(1));
            //生命周期為60*60秒,最小1小時為間隔,保證業務及釋放
            jedis.expire(key, 60 * 60);
        }
        jedis.close();
    }

發送短信方法中調用

//判斷是否達到該時間段短信發送限制(系統、IP限制)
if(!(redisService.checkIPLimit(ip) && redisService.checkSysLimit())){
        responseEntity.setting(CodeEnum.PHONE_LIMIT);
        RequestContext.setResponseEntity(responseEntity);
        return;
}
redisService.setIPLimit(ip);
redisService.setSysLimit();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 轉載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,467評論 0 82
  • NOSQL類型簡介鍵值對:會使用到一個哈希表,表中有一個特定的鍵和一個指針指向特定的數據,如redis,volde...
    MicoCube閱讀 4,062評論 2 27
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,372評論 11 349
  • 水,這個字大家并不陌生,你在生活中必不可少的就是水,做飯得需要水,洗澡需要水,渴了就得喝水,可以說,沒有水,就沒有...
    ecc40896f134閱讀 174評論 0 1