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

发送成功之后才计时:
发送短信按钮倒计时服务器端支持
 

 

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 设置了超时时间

相关文章: