发送短信按钮倒计时服务器端支持

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

发送短信按钮倒计时服务器端支持

发送成功之后才计时:

 

 

Java代码   收藏代码
  1. /*** 
  2.      * 服务器端启动倒计时,即记录时间戳 
  3.      * 
  4.      * @param mobile 
  5.      */  
  6.     private void setSMSLimit(String mobile) {  
  7.         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();  
  8.         HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();  
  9.         saveExpxKeyCache(request, response, mobile, String.valueOf(DateTimeUtil.getCurrentTimeSecond()), 60);  
  10.     }  

 上述代码中的saveExpxKeyCache 是关键方法,用于记录时间戳

Java代码   收藏代码
  1. public /*synchronized*/ void saveExpxKeyCache(HttpServletRequest request, HttpServletResponse response, String k, String v,long time) {  
  2.   
  3.         String cid = getCid(request, response);  
  4.   
  5. //        logger.debug("cid is " + cid);  
  6. //        logger.debug("set " + k + " to value : " + v);  
  7.   
  8.         RedisHelper helper = RedisHelper.getInstance();  
  9.         helper.saveExpxKeyCache(cid+k,  v,time);  
  10.   
  11.   
  12.     }  

 对上述方法的说明:

参数说明:

(1)k:redis的key,比如手机号;

(2)v:redis的value,比如发送短信时的时间戳;

(3)time:超时时间

 

time就是发送短信间隔的时间,所以就是60秒,这个方法的功能:

60秒之后,这条记录被自动删除.

 

 发送短信之前得检查是否在60秒之内发送短信:

Java代码   收藏代码
  1. public WapResponseDto sendMobileSMS(HttpServletRequest request, HttpServletResponse response,  
  2.                                        String mobile,  
  3.                                        String type/*, 
  4.                               String authImage*/) {  
  5.        WapResponseDto wapResponseDto = null;  
  6.   
  7.        //检查格式  
  8.        if (!StringUtil.isMobileNumber(mobile)) {  
  9.            wapResponseDto = new WapResponseDto();  
  10.            wapResponseDto.setResult(false);  
  11.            wapResponseDto.setErrorFieldName("mobile");  
  12.            wapResponseDto.setErrorMessage(Constant.ERROR_MESSAGE_MOBILE_FORMAT_INVALID);  
  13.            return wapResponseDto;  
  14.        }  
  15.        WapResponseDto SMSLimitResponseDto = verifySMSLimit(mobile);  
  16.        if (!StringUtil.isNullOrEmpty(SMSLimitResponseDto)) {//检查一分钟之内不能重复发送手机短信  
  17.            return SMSLimitResponseDto;  
  18.        }  

 

 

Java代码   收藏代码
  1. /*** 
  2.      * 检查一分钟之内不能重复发送手机短信 
  3.      * 
  4.      * @param mobile 
  5.      * @return : 返回null则表示校验通过 
  6.      */  
  7.     public WapResponseDto verifySMSLimit(String mobile) {  
  8.         int remainingTime = sMSWaitingTime(mobile, false);//一分钟之内不能重复发送手机短信  
  9.         if (remainingTime > 0) {  
  10.             SMSRemainingTimeDto sMSRemainingTimeDto = new SMSRemainingTimeDto();  
  11.             sMSRemainingTimeDto.setResult(false);  
  12.             sMSRemainingTimeDto.setErrorMessage(Constant.getErrorMsg("a00001"));  
  13.             sMSRemainingTimeDto.setRemainingSecond(remainingTime);  
  14.             return sMSRemainingTimeDto;  
  15.         }  
  16.         return null;  
  17.     }  

 

sMSWaitingTime 用于检查还要等待多长时间:

Java代码   收藏代码
  1. /*** 
  2.      * 倒计时还剩余多长时间 
  3.      * @param mobile : 手机号 
  4.      * @param reallySendSMS : 是否真正发送短信 
  5.      * @return : second 
  6.      */  
  7.     public int sMSWaitingTime(String mobile,boolean reallySendSMS) {  
  8.         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();  
  9.         HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();  
  10.         RedisHelper rdsHelper = RedisHelper.getInstance();  
  11.         String cid = getCid(request, response);  
  12.           
  13.         String lastSendSMSTime = rdsHelper.getCache(cid+mobile);  
  14.   
  15.         if(StringUtil.isNullOrEmpty(lastSendSMSTime)) {  
  16.             if(reallySendSMS){  
  17.                 saveExpxKeyCache(request, response, mobile, String.valueOf(DateTimeUtil.getCurrentTimeSecond()),60);  
  18.             }  
  19.             return 0;//不需要倒计时  
  20.         } else {  
  21.             long lastSendSMSTimeSecond=Long.parseLong(lastSendSMSTime);  
  22.             long currentTimeSecond=DateTimeUtil.getCurrentTimeSecond();  
  23.             int delter=(int) (currentTimeSecond-lastSendSMSTimeSecond);  
  24.             if(delter>=60){  
  25.                 return 0;//不需要倒计时  
  26.             }else{  
  27.                 return 60-delter;  
  28.             }  
  29.         }  
  30.     }  

 

注意:如果超过60秒,lastSendSMSTime 应该是为null的.因为我通过saveExpxKeyCache 设置了超时时间

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
测试技术 Linux 数据安全/隐私保护
Linux系统分别调用不同邮件服务器465端口发送短信
环境:centos7.2 python2.7.6 简介:通过编写的Python 脚本实现调用不同的邮件服务器465 端口发送短信。共四个。 脚本内容如下,具体内容不做介绍,主要是讲解如何通过该脚本实现上述需求。
5525 1
|
.NET 开发框架 JavaScript
asp.net关于WEB端用户重复提交问题。禁用服务器控件按钮问题。
之前也经常遇到这种问题。但是没有去刻意研究并解决。也知道有很多解决方案。但是都没有去亲自实现。直到现在工作中出现这个棘手问题,才去寻找各种解决方案并研究。 还好网上有很多前辈的经验。现在问题算是解决了。因此做个笔记以防后面还会遇到此种问题。虽然这个解决方法不一定很好,但是还是可以实现的。 点击一个按钮,只让此按钮的事件执行一次,防止用户多次点击,造成多次提交数据。因为此事件的方法执行需
1385 0
|
8天前
|
人工智能 弹性计算 编解码
阿里云GPU云服务器性能、应用场景及收费标准和活动价格参考
GPU云服务器作为阿里云提供的一种高性能计算服务,通过结合GPU与CPU的计算能力,为用户在人工智能、高性能计算等领域提供了强大的支持。其具备覆盖范围广、超强计算能力、网络性能出色等优势,且计费方式灵活多样,能够满足不同用户的需求。目前用户购买阿里云gpu云服务器gn5 规格族(P100-16G)、gn6i 规格族(T4-16G)、gn6v 规格族(V100-16G)有优惠,本文为大家详细介绍阿里云gpu云服务器的相关性能及收费标准与最新活动价格情况,以供参考和选择。
|
13天前
|
机器学习/深度学习 人工智能 弹性计算
什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。
|
15天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
13天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
下一篇
无影云桌面