文档章节

发送短信如何限制1小时内最多发送11条短信

黄威
 黄威
发布于 06/25 23:47
字数 764
阅读 25
收藏 0
点赞 0
评论 0

发送短信如何限制1小时内最多发送11条短信

场景:
发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信.
如何实现呢?

思路有两个

截至到当前时刻的1个小时之内,看是否有超过11条短信

Date now=new Date();
Date oneHourAgo= //1个小时之前的时刻
//查询条件有两个:时间范围,手机号
List<SMS> smsList=this.smsService.query(fromTime,toTime,mobile);
if(smsList.size()>11){
System.out.println("超出限制,禁止发送");
}else{
System.out.println("可以发送");
}

dao中:

/***
     * 获取指定时间长度(范围)内,发送的短信次数 <br />
     * 在指定时间长度(范围)内,发送的短信次数是否超出限制
     * @param startDate
     * @param endDate
     * @param mobile
     * @return
     */
    public Long count(String startDate, String endDate, String mobile) {
        CriteriaHelper criteriaHelper = CriteriaHelper.getInstance(this);
       return criteriaHelper.between("createTime",startDate,endDate)
                .eq("mobile",mobile)
                .count();
    }

Service中:

 /***
     * 在指定时间长度(范围)内,发送的短信次数是否超出限制
     * @param mobile
     * @return
     */
    public  boolean validateSMSSendCountByTimeRange(String mobile) {
        Date now=new Date();
        //1小时前的时刻
        Date oneHouseAgo = TimeHWUtil.getDateBeforeHour(now, 1);
        Long count = this.sMSDao.count(TimeHWUtil.formatDateTime(oneHouseAgo), TimeHWUtil.formatDateTime(now), mobile);
        if (count >= SMSUtil.LIMITCOUNT_SEND_SMS) {
            String msg="超出限制";
            logger.warn(msg);
            smsLogger.warn(msg);
            return false;
        }
        return true;
    }

最近的11条短信 时间跨度是否小于1小时,如果小于1小时,就禁止发送

每次发送短信,要写入当前时间戳到redis:
String mobile="13718486139"; String time=String.valueOf(DateTimeUtil.getCurrentMillisecond()); RedisHelper.getInstance().saveKeyCache("limit_one_hour", mobile+"_"+time, time);

检查时先获取所有时间戳:

Map map=RedisHelper.getInstance().getAllKeyCache("limit_one_hour"); 

具体判断逻辑:

@Test  
    public void test_limitOneHour2(){  
        String mobile="13718486139";  
        int limitCount=11;  
        int limitTime=60*60;//1小时,单位:秒  
        Map<String,String> map=new HashMap<String,String>();  
        map.put("13718486139_1445429819328", "1445431479437");  
        map.put("13718486139_1445429874699", "1445431485996");  
        map.put("13718486139_1445429874799", "1445431491527");  
        map.put("13718486139_1445430757886", "1445431496853");  
          
        System.out.println(map);  
        List<Long>list=new ArrayList<Long>();  
        for(String key:map.keySet()){  
            if(key.startsWith(mobile)){  
                list.add(Long.parseLong(map.get(key))/1000);  
            }  
        }  
        SortList<Long>sortUtil=new SortList<Long>();  
        sortUtil.Sort(list, "longValue", "desc");  
        int length=list.size();  
        int toIndex=0;//要截取的最大序号  
        if(limitCount>length){  
            toIndex=length;  
        }else{  
            toIndex=limitCount;  
        }  
        List<Long>result=list.subList(0, toIndex);  
        long delter=list.get(0).longValue()-list.get(toIndex-1).longValue();  
        long delterSecond=delter;  
        System.out.println(delterSecond);  
        if(delterSecond<limitTime){  
            System.out.println("超限");  
        }else{  
            System.out.println("可以继续发短信");  
        }  
        System.out.println(result);  
    }  

步骤:
(1)把当前手机号的所有时间戳放入list中;

(2)对list排序,按时间顺序,从大到小;(时间越大,表示离现在越近)

(3)根据次数(limitCount)限制 来截取list;

(4)计算list中第一个元素和最后一个元素的差量,即limitCount条短信的时间跨度delter

(5)若delter 小于时间限制limitTime,则表示超过限制,那么禁止发送短信

使用限流器

参考: https://my.oschina.net/hanchao/blog/1833612 参考:http://hw1287789687.iteye.com/blog/2250898

© 著作权归作者所有

共有 人打赏支持
黄威
粉丝 9
博文 46
码字总数 25025
作品 0
昌平
程序员
运营商回应拜年短信“被重发”多扣费质疑

新华网北京2月5日电(记者张舵)春节期间,拜年短信满天飞,给全国上下带来浓浓的年味,也给一些人带来了烦恼。针对有手机用户反映“拜年短信 ‘被重发’是否会被多扣费”,中国移动和中国联通...

红薯
2011/02/07
307
0
微信小程序 - 使用阿里云发送短信

开发中使用微信小程序发送短信验证码,总结下使用的流程。 这个是首次接入完整的流程图,按照流程来基本可以实现接入。 介绍下签名和模板: 刚开始看这几个字时候会想这是啥东西?要仔细看官...

hp2017
05/05
0
0
伪基站潜伏 垃圾短信围困手机

当随处可见的小广告纸贴在一座城市的大街小巷时,作为市民,你可以不信不问;可当垃圾、违法短信不时侵入手机时,你的生活则真正地被骚扰了。 根据北京地区网站联合辟谣平台近日发布的《201...

oschina
2013/11/18
4.3K
51
模拟实现简易的移动用户资费统计系统

具体需求如下: 移动运营商A设置两种类型的用户:普通用户及VIP用户,现该运营商已有5个VIP用户和15个普通用户,共计20个用户。 普通用户资费标准如下(不考虑漫游和长途): 【基准资费】 ...

laodongli
2011/02/24
0
0
Java通过SMS短信平台实现发短信功能

本程序是通过使用中国网建提供的SMS短信平台实现的(该平台目前为注册用户提供5条免费短信,3条免费彩信,这足够用于我们测试用了。在使用前需要注册,注册地址为http://sms.webchinese.cn/...

zh151832
2015/12/01
350
0
中国移动启用梦网业务扣费主动提醒功能

7月12日消息,网易科技从中国移动内部获悉,中国移动已启用“梦网业务扣费主动提醒”功能。也就是说,梦网业务在订购扣费之前,将向用户发送二次确认的 短信。 据悉,短信、彩信、WAP等包月类...

鉴客
2010/07/12
546
1
请教Android定时短信发送的问题

hi,我在做一个andorid定时发送短信的小程序 需要定时从后台获得需要发送短信的手机号码列表 假设我从后台获得20条需要发送的短信,然后for循环为每条短信开启一个线程去不断发送 同时每个线程...

Macrotea
2013/09/13
548
7
HTTP电脑发送短信接口调用示例

一、工作方式 双方通过HTTP方式交互数据,第三方可以简单的“name=value”方式发送提交内容或响应请求内容。即通过HTTP的GET/POST方式交换。 另外双方需要保证数据传输的完整性和安全性,每次...

维美金牌信通
2014/07/01
0
1
为什么中国人酷爱发短信?

一则不能完全确定真实性的消息说,比尔·盖茨曾经很困惑地问中国下属(据说是唐骏):中国人为何酷爱短信?回答是:这是一种中国式含蓄的交流方式。 用手机发送祝福短信拜年是中国人祝贺新年...

红薯
2011/02/11
3.2K
17
网站遭受CC攻击的解决办法

前两天,网站的注册发送手机短信验证码的接口受到攻击,一个半小时,1万条短信都发出去了。可见,我们的安全防护做的多么不好。 分析攻击方式: 1) 多台机器模拟人工操作,随机输入手机号,...

yy20031205
2016/10/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring boot中swagger2使用

1.pom.xml中添加 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version>......

说回答
2分钟前
0
0
tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
14分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
19分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
19分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
34分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
35分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
42分钟前
1
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
46分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
52分钟前
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
57分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部