前端验证码倒计时必须同步后端限流状态:请求前校验本地令牌、成功后用X-RateLimit-Remaining更新剩余时间、429时按Retry-After强制重置倒计时并锁定按钮。

当用户点击“获取验证码”按钮后,前端必须立刻启动倒计时、禁用按钮,并在60秒结束时准确恢复可用状态,同时还要响应后端真实限流结果——比如收到429或X-RateLimit-Remaining为0时提前中止倒计时并提示“请求过于频繁”,不能只靠自己计时。
读取并信任后端限流响应头
每次请求返回后,立即检查响应头中的X-RateLimit-Remaining和Retry-After字段。
若response.headers.get('X-RateLimit-Remaining')存在,解析为整数,直接覆盖本地剩余令牌数;该值比前端performance.now()估算更权威,【不可跳过此步,否则本地状态将与后端脱节】。
若response.status === 429且response.headers.get('Retry-After')存在,立即清除当前倒计时定时器,并暂停所有同类请求队列,等待指定秒数后再恢复。
立即学习“前端免费学习笔记(深入)”;
前端倒计时组件实现(setTimeout递归版)
方法一:基础倒计时逻辑
点击按钮后,立即将按钮disabled设为true,并调用startCountdown(60)函数。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
startCountdown(seconds)函数内部:显示seconds秒→若seconds > 0,则setTimeout(() => startCountdown(seconds - 1), 1000);若seconds === 0,则重置按钮文本、移除disabled、触发onComplete回调。
方法二:支持中断与续期的增强版
倒计时开始前,先存localStorage.setItem('code_sent_at', Date.now());页面加载时读取该时间戳,计算已过去秒数,自动补出剩余时间,避免切tab导致倒计时卡住。
每次新请求发起前,先clearTimeout(currentTimerId),防止旧定时器残留干扰;【漏掉这步会导致多次点击后多个倒计时并发运行】。
联动后端限流状态的三步校准
第一步:请求发出前,检查本地缓存的remainingTokens是否 ≥ 1;不满足则直接阻止请求,提示“请稍后再试”。
第二步:请求成功返回后,用X-RateLimit-Remaining更新本地remainingTokens,并同步更新UI倒计时剩余值(例如从58秒跳到32秒)。
第三步:若收到429响应且Retry-After=30,则立即把倒计时强制设为30秒,并锁定按钮;此时不再依赖原60秒逻辑,完全以服务端指令为准。

















