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

本文介绍了一种基于服务器端的时间戳记录实现短信发送倒计时的机制,通过限制短信发送频率来防止恶意请求,利用Redis缓存存储发送时间并设置过期时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

发送成功之后才计时:

 

 

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

 

 

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值