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

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

发送成功之后才计时:

 

/***
     * 服务器端启动倒计时,即记录时间戳
     *
     * @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 设置了超时时间

猜你喜欢

转载自hw1287789687.iteye.com/blog/2250860
今日推荐