发送短信按钮倒计时服务器端支持
发送成功之后才计时:
- /***
- * 服务器端启动倒计时,即记录时间戳
- *
- * @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 设置了超时时间