发送短信按钮倒计时服务器端支持
发送成功之后才计时:
/*** * 服务器端启动倒计时,即记录时间戳 * * @param mobile */ private void setSMSLimit(String mobile) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); saveExpxKeyCache(request, response, mobile, String.valueOf(DateTimeUtil.getCurrentTimeSecond()), 60); }
上述代码中的saveExpxKeyCache 是关键方法,用于记录时间戳
public /*synchronized*/ void saveExpxKeyCache(HttpServletRequest request, HttpServletResponse response, String k, String v,long time) { String cid = getCid(request, response); // logger.debug("cid is " + cid); // logger.debug("set " + k + " to value : " + v); RedisHelper helper = RedisHelper.getInstance(); helper.saveExpxKeyCache(cid+k, v,time); }
对上述方法的说明:
参数说明:
(1)k:redis的key,比如手机号;
(2)v:redis的value,比如发送短信时的时间戳;
(3)time:超时时间
time就是发送短信间隔的时间,所以就是60秒,这个方法的功能:
60秒之后,这条记录被自动删除.
发送短信之前得检查是否在60秒之内发送短信:
public WapResponseDto sendMobileSMS(HttpServletRequest request, HttpServletResponse response, String mobile, String type/*, String authImage*/) { WapResponseDto wapResponseDto = null; //检查格式 if (!StringUtil.isMobileNumber(mobile)) { wapResponseDto = new WapResponseDto(); wapResponseDto.setResult(false); wapResponseDto.setErrorFieldName("mobile"); wapResponseDto.setErrorMessage(Constant.ERROR_MESSAGE_MOBILE_FORMAT_INVALID); return wapResponseDto; } WapResponseDto SMSLimitResponseDto = verifySMSLimit(mobile); if (!StringUtil.isNullOrEmpty(SMSLimitResponseDto)) {//检查一分钟之内不能重复发送手机短信 return SMSLimitResponseDto; }
/*** * 检查一分钟之内不能重复发送手机短信 * * @param mobile * @return : 返回null则表示校验通过 */ public WapResponseDto verifySMSLimit(String mobile) { int remainingTime = sMSWaitingTime(mobile, false);//一分钟之内不能重复发送手机短信 if (remainingTime > 0) { SMSRemainingTimeDto sMSRemainingTimeDto = new SMSRemainingTimeDto(); sMSRemainingTimeDto.setResult(false); sMSRemainingTimeDto.setErrorMessage(Constant.getErrorMsg("a00001")); sMSRemainingTimeDto.setRemainingSecond(remainingTime); return sMSRemainingTimeDto; } return null; }
sMSWaitingTime 用于检查还要等待多长时间:
/*** * 倒计时还剩余多长时间 * @param mobile : 手机号 * @param reallySendSMS : 是否真正发送短信 * @return : second */ public int sMSWaitingTime(String mobile,boolean reallySendSMS) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); RedisHelper rdsHelper = RedisHelper.getInstance(); String cid = getCid(request, response); String lastSendSMSTime = rdsHelper.getCache(cid+mobile); if(StringUtil.isNullOrEmpty(lastSendSMSTime)) { if(reallySendSMS){ saveExpxKeyCache(request, response, mobile, String.valueOf(DateTimeUtil.getCurrentTimeSecond()),60); } return 0;//不需要倒计时 } else { long lastSendSMSTimeSecond=Long.parseLong(lastSendSMSTime); long currentTimeSecond=DateTimeUtil.getCurrentTimeSecond(); int delter=(int) (currentTimeSecond-lastSendSMSTimeSecond); if(delter>=60){ return 0;//不需要倒计时 }else{ return 60-delter; } } }
注意:如果超过60秒,lastSendSMSTime 应该是为null的.因为我通过saveExpxKeyCache 设置了超时时间