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

本文涉及的产品
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 端口发送短信。共四个。 脚本内容如下,具体内容不做介绍,主要是讲解如何通过该脚本实现上述需求。
5493 1
|
.NET 开发框架 JavaScript
asp.net关于WEB端用户重复提交问题。禁用服务器控件按钮问题。
之前也经常遇到这种问题。但是没有去刻意研究并解决。也知道有很多解决方案。但是都没有去亲自实现。直到现在工作中出现这个棘手问题,才去寻找各种解决方案并研究。 还好网上有很多前辈的经验。现在问题算是解决了。因此做个笔记以防后面还会遇到此种问题。虽然这个解决方法不一定很好,但是还是可以实现的。 点击一个按钮,只让此按钮的事件执行一次,防止用户多次点击,造成多次提交数据。因为此事件的方法执行需
1375 0
|
26天前
|
Cloud Native Java 编译器
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
随着云计算技术的不断发展,云服务商们不断推出高性能、高可用的云服务器实例,以满足企业日益增长的计算需求。阿里云推出的倚天实例,凭借其基于ARM架构的倚天710处理器,提供了卓越的计算能力和能效比,特别适用于云原生、高性能计算等场景。然而,有的用户需要将传统基于x86平台的应用迁移到倚天实例上,本文将介绍如何将基于x86架构平台的应用迁移到阿里云倚天实例的服务器上,帮助开发者和企业用户顺利完成迁移工作,享受更高效、更经济的云服务。
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
|
24天前
|
编解码 前端开发 安全
通过阿里云的活动购买云服务器时如何选择实例、带宽、云盘
在我们选购阿里云服务器的过程中,不管是新用户还是老用户通常都是通过阿里云的活动去买了,一是价格更加实惠,二是活动中的云服务器配置比较丰富,足可以满足大部分用户的需求,但是面对琳琅满目的云服务器实例、带宽和云盘选项,如何选择更适合自己,成为许多用户比较关注的问题。本文将介绍如何在阿里云的活动中选择合适的云服务器实例、带宽和云盘,以供参考和选择。
通过阿里云的活动购买云服务器时如何选择实例、带宽、云盘
|
22天前
|
弹性计算 运维 安全
阿里云轻量应用服务器和经济型e实例区别及选择参考
目前在阿里云的活动中,轻量应用服务器2核2G3M带宽价格为82元1年,2核2G3M带宽的经济型e实例云服务器价格99元1年,对于云服务器配置和性能要求不是很高的阿里云用户来说,这两款服务器配置和价格都差不多,阿里云轻量应用服务器和ECS云服务器让用户二选一,很多用户不清楚如何选择,本文来说说轻量应用服务器和经济型e实例的区别及选择参考。
阿里云轻量应用服务器和经济型e实例区别及选择参考
|
23天前
|
机器学习/深度学习 存储 人工智能
阿里云GPU云服务器实例规格gn6v、gn7i、gn6i实例性能及区别和选择参考
阿里云的GPU云服务器产品线在深度学习、科学计算、图形渲染等多个领域展现出强大的计算能力和广泛的应用价值。本文将详细介绍阿里云GPU云服务器中的gn6v、gn7i、gn6i三个实例规格族的性能特点、区别及选择参考,帮助用户根据自身需求选择合适的GPU云服务器实例。
阿里云GPU云服务器实例规格gn6v、gn7i、gn6i实例性能及区别和选择参考
下一篇
无影云桌面