短信验证码防刷机制,你现在是怎么做的
//检查是否相隔60秒后发送 $limitKey = "mobile_sms_send_limit:" . $mobile; $smsSendLimit = Yii::app()->redis->get($limitKey); if ($smsSendLimit) { $this->_end(1, '60秒后才能重新发送短信验证码!'); }
//检查发送次数 $key = "mobile_sms_send_times:" . $mobile . ":" . date("YmdHis"); $smsSendTimes = Yii::app()->redis->get($key); if (empty($smsSendTimes)) { $smsSendTimes = 0; } else if ($smsSendTimes >= 5) { $this->_end(1, '每个手机号每天最多能发5条短信!'); }
<?php //这里判断是否存在短信缓存 if(Cache::get('codeCache') != null){ //短信30分钟内存在,则继续发同一条短信给用户 $code = Cache::get('codeCache'); //接下来把code发给用户的业务操作 。。。 }else{ //接收短信验证码 $code = $this->smsTplTrait() //假如这里作为接收到短信"562334" //将接收到的code存在Cache里30分钟 Cache::put('codeCache', $code, 30); } ?>
1) 客户端请求到页面的同时,向服务端发起请求,服务端生成验证码将验证码字符,存入到session中以备客户端的校验。与此同时,服务端将生成的验证码图形给到前端;
2) 前端获取到验证码图形,渲染展示到页面。用户识别图形验证码后,提交验证码的字符到服务端;
3) 服务端接收到验证码校验的请求,将接收到的字符与session中存储的验证码字符进行比对,并将比对结果返回到前端。
前端部分代码
<p class="form-group col-lg-6"> <label for="id" class="col-sm-4 control-label"> 验证码: </label> <p class="col-sm-8"> <input type="text" id="code" name="code" class="form-control" style="width:250px;" /> <img id="imgObj" alt="验证码" src="/article/getValidateCode" οnclick="changeImg()" /> <a href="#" οnclick="changeImg()">换一张</a> </p>