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

本文涉及的产品
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 端口发送短信。共四个。 脚本内容如下,具体内容不做介绍,主要是讲解如何通过该脚本实现上述需求。
5596 1
|
.NET 开发框架 JavaScript
asp.net关于WEB端用户重复提交问题。禁用服务器控件按钮问题。
之前也经常遇到这种问题。但是没有去刻意研究并解决。也知道有很多解决方案。但是都没有去亲自实现。直到现在工作中出现这个棘手问题,才去寻找各种解决方案并研究。 还好网上有很多前辈的经验。现在问题算是解决了。因此做个笔记以防后面还会遇到此种问题。虽然这个解决方法不一定很好,但是还是可以实现的。 点击一个按钮,只让此按钮的事件执行一次,防止用户多次点击,造成多次提交数据。因为此事件的方法执行需
1405 0
|
11天前
|
弹性计算 运维 监控
【阿里云】控制台使用指南:从创建ECS到系统诊断测评
本文介绍了如何通过阿里云获取ECS云服务器并进行操作系统配置与组件安装,以实现高效的资源管理和系统监控。阿里云凭借强大的基础设施和丰富的服务成为用户首选。文中详细描述了获取ECS、RAM授权、开通操作系统控制台及组件安装的步骤,并展示了如何利用控制台实时监控性能指标、诊断系统问题及优化性能。特别针对idle进程进行了深入分析,提出了优化建议。最后,建议定期进行系统健康检查,并希望阿里云能推出更友好的低成本套餐,满足学生等群体的需求。
74 17
【阿里云】控制台使用指南:从创建ECS到系统诊断测评
|
7天前
|
人工智能 运维 数据可视化
玩转云服务器——阿里云操作系统控制台体验测评
在云服务器日益普及的背景下,运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态,又能智能诊断问题,提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式,致力于提升操作效率,为用户带来全新的系统运维体验。阿里云操作系统控制台凭借便捷易用的设计和高效的管理功能,成为云服务器运维的强力助手。本次测评基于真实体验截图,对其整体表现进行了深入探索。
65 33
|
1天前
|
域名解析 人工智能 弹性计算
DeepSeek服务器繁忙解决方法:使用阿里云一键部署DeepSeek个人网站!
通过阿里云一键部署DeepSeek个人网站,解决服务器繁忙问题。学生用户可领取300元代金券实现0成本部署,普通用户则可用99元/年的服务器。教程涵盖从选择套餐、设置密码到获取百炼API-KEY的全流程,助您快速搭建专属大模型主页,体验DeepSeek、Qwen-max、Llama等多款模型,无需代码,最快5分钟完成部署。支持绑定个人域名,共享亲友使用,日均成本仅约1元。
28 10
|
12天前
|
弹性计算 Linux 数据安全/隐私保护
阿里云幻兽帕鲁联机服务器搭建全攻略,速来抄作业!2025新版教程
阿里云提供2025年最新幻兽帕鲁服务器申请购买及一键开服教程。4核16G配置支持8人,70元/月;8核32G配置支持20人,160元/月。选择配置、地域、操作系统后,点击【一键购买及部署】,约3分钟完成创建。本地安装STEAM客户端并登录,进入游戏选择多人模式,输入服务器IP和端口(8211),即可开始游戏。详细教程及更多问题解答请参考阿里云幻兽帕鲁游戏专区。
61 20