详解ThinkPHP3.2.3验证码显示、刷新、校验


Posted in PHP onDecember 29, 2016

ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下:

显示验证码

首先在Home/Controller下创建一个公共控制器PublicController

<?php
namespace Home\Controller;

use Think\Controller;
use Think\Verify;

class PublicController extends Controller
{

  /* 生成验证码 */
  public function verify()
  {
    $config = [
      'fontSize' => 19, // 验证码字体大小
      'length' => 4, // 验证码位数
      'imageH' => 34
    ];
    $Verify = new Verify($config);
    $Verify->entry();
  }

  /* 验证码校验 */
  public function check_verify($code, $id = '')
  {
    $verify = new \Think\Verify();
    $res = $verify->check($code, $id);
    $this->ajaxReturn($res, 'json');
  }
}

verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。

check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
前台模板页建立index.html

<div class="">
 <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
 name="j_verify" type="text" class="form-control x in">
 <img id="verify_img" alt="点击更换" title="点击更换"
 src="{:U('public/verify',array())}" class="m">
 </div>

使用Thinkphp的U方法形成生成验证码的图片。

点击刷新验证码

从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。

我们可以考虑实现public/verify/变量值的形式URL。

$("#verify_img").click(function() {
  var verifyURL = "public/verify";
  var time = new Date().getTime();
  $("#verify_img").attr({
   "src" : verifyURL + "/" + time
  });
});

利用JS获取当前时间戳加入到URL之后即可。

到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。

异步校验验证码

大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

$("#j_verify").keyup(function() {
  $.post("public/check_verify", {
    code : $("#j_verify").val()
    }, function(data) {
    if (data == true) {
      //验证码输入正确
    } else {
      //验证码输入错误
    }
  });
});

利用onekeyup。原理就不需要多讲了吧!

这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!

还没结束:

当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:

以下是该类初始的config配置:

protected $config =  array(
    'seKey'   => 'ThinkPHP.CN',  // 验证码加密密钥
    'codeSet'  => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',       // 验证码字符集合
    'expire'  => 1800,      // 验证码过期时间(s)
    'useZh'   => false,      // 使用中文验证码 
    'zhSet'   => '……此处不粘贴了,太多了!',       // 中文验证码字符串
    'useImgBg' => false,      // 使用背景图片 
    'fontSize' => 25,       // 验证码字体大小(px)
    'useCurve' => false,      // 是否画混淆曲线
    'useNoise' => false,      // 是否添加杂点  
    'imageH'  => 0,        // 验证码图片高度
    'imageW'  => 0,        // 验证码图片宽度
    'length'  => 5,        // 验证码位数
    'fontttf'  => '',       // 验证码字体,不设置随机获取
    'bg'    => array(243, 251, 254), // 背景颜色
    'reset'   => true,      // 验证成功后是否重置
    );

请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。

好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
php之对抗Web扫描器的脚本技巧
Oct 01 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
PHP的SQL注入实现(测试代码安全不错)
Feb 27 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
PHP面向对象详解(三)
Dec 07 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
Smarty3配置及入门语法
Feb 22 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
php常用数组函数实例小结
Dec 29 #PHP
php正则修正符用法实例详解
Dec 29 #PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 #PHP
php preg_match的匹配不同国家语言实例
Dec 29 #PHP
php使用正则表达式获取字符串中的URL
Dec 29 #PHP
php实现水印文字和缩略图的方法示例
Dec 29 #PHP
PHPMailer发送邮件
Dec 28 #PHP
You might like
PHP获取网站域名和地址的代码
2008/08/17 PHP
php 面向对象的一个例子
2011/04/12 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
Jquery中CSS选择器用法分析
2015/02/10 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
python中的yield使用方法
2014/02/11 Python
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
scrapy爬虫完整实例
2018/01/25 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
技校个人求职信范文
2014/01/25 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
学生会辞职信
2015/03/02 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
python中filter,map,reduce的作用
2022/06/10 Python