短信限制

獲取用戶真實(shí)IP地址

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

public class IPUtil {

    /**
     * 獲取請(qǐng)求的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")) {
                // 根據(jù)網(wǎng)卡取本機(jī)配置的IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                ipAddress = inet.getHostAddress();
            }

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

獲取配置文件屬性值

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

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

redis目錄設(shè)置

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

//系統(tǒng)次數(shù)限制key(1小時(shí)內(nèi)50條)
private static final String USER_PHONEMSG_SYSTEM_LIMIT = "USER_PHONEMSG_SYSTEM_LIMIT" + ":";

判斷當(dāng)前IP是否達(dá)到發(fā)送限制

/**
     * 判斷當(dāng)前IP是否達(dá)到發(fā)送限制
     *
     * @param ip
     * @return
     */
    public boolean checkIPLimit(String ip) {
        Jedis jedis = jedisPool.getResource();
        Calendar c = Calendar.getInstance();
        //獲取當(dāng)前幾號(hào)
        int datenum = c.get(Calendar.DATE);
        //今天是否有發(fā)送記錄
        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;
        }
    }

判斷當(dāng)前系統(tǒng)是否達(dá)到發(fā)送限制

/**
     * 判斷當(dāng)前系統(tǒng)是否達(dá)到發(fā)送限制
     *
     * @return
     */
    public boolean checkSysLimit() {
        Jedis jedis = jedisPool.getResource();
        Calendar c = Calendar.getInstance();
        //獲取當(dāng)前是幾時(shí)
        int hournum = c.get(Calendar.HOUR_OF_DAY);
        //當(dāng)前小時(shí)是否有發(fā)送記錄
        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;
        }
    }

當(dāng)前IP發(fā)送短信數(shù)加1

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

判斷當(dāng)前系統(tǒng)是否達(dá)到發(fā)送限制

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

發(fā)送短信方法中調(diào)用

//判斷是否達(dá)到該時(shí)間段短信發(fā)送限制(系統(tǒng)、IP限制)
if(!(redisService.checkIPLimit(ip) && redisService.checkSysLimit())){
        responseEntity.setting(CodeEnum.PHONE_LIMIT);
        RequestContext.setResponseEntity(responseEntity);
        return;
}
redisService.setIPLimit(ip);
redisService.setSysLimit();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霍比,一起剝皮案震驚了整個(gè)濱河市暴备,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浅妆,老刑警劉巖汰瘫,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趴乡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晾捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門哀托,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胖齐,你說(shuō)我怎么就攤上這事嗽冒⊙交铮” “怎么了添坊?”我有些...
    開(kāi)封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵贬蛙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阳准,道長(zhǎng),這世上最難降的妖魔是什么野蝇? 我笑而不...
    開(kāi)封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮乱灵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘规婆。我一直安慰自己,他們只是感情好抒蚜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布耘戚。 她就那樣靜靜地躺著,像睡著了一般饿这。 火紅的嫁衣襯著肌膚如雪撞秋。 梳的紋絲不亂的頭發(fā)上长捧,一...
    開(kāi)封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天串结,我揣著相機(jī)與錄音,去河邊找鬼肌割。 笑死帐要,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宠叼。 我是一名探鬼主播其爵,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼简烤!你這毒婦竟也來(lái)了摇幻?” 一聲冷哼從身側(cè)響起横侦,我...
    開(kāi)封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枉侧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后榨馁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屑柔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年珍剑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唧瘾。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迫像,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闻妓,到底是詐尸還是另有隱情,我是刑警寧澤由缆,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布均唉,位于F島的核電站是晨,受9級(jí)特大地震影響舔箭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜层扶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一镜会、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戳表,春花似錦昼伴、人聲如沸镣屹。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鞭光,卻和暖如春吏廉,著一層夾襖步出監(jiān)牢的瞬間惰许,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工佩伤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晦毙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓见妒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盐股。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)卵酪,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,445評(píng)論 0 82
  • NOSQL類型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表溢豆,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)塑煎,如redis臭蚁,volde...
    MicoCube閱讀 3,961評(píng)論 2 27
  • 從三月份找實(shí)習(xí)到現(xiàn)在讯赏,面了一些公司冷尉,掛了不少漱挎,但最終還是拿到小米雀哨、百度、阿里雾棺、京東、新浪捌浩、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,213評(píng)論 11 349
  • 水进统,這個(gè)字大家并不陌生浪听,你在生活中必不可少的就是水螟碎,做飯得需要水迹栓,洗澡需要水,渴了就得喝水迈螟,可以說(shuō),沒(méi)有水答毫,就沒(méi)有...
    ecc40896f134閱讀 159評(píng)論 0 1