ThinkPHP 验证码详解及实例

ThinkPHP 验证码详解及实例

ThinkPHP 验证码

 

ThinkPHP 内置了验证码的支持,可以直接使用。要使用验证码,需要导入扩展类库中的 ORG.Util.Image 类库和 ORG.Util.String 类库。 

 

验证码方法

我们通过在在模块类中增加一个 verify 方法来用于显示验证码,最简单的例子: 

Publicfunctionverify(){

// 导入Image类库
import(“ORG.Util.Image”);
Image::buildImageVerify();
}

import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。如果已经将 Image 类库拷贝到了当前项目下,如 Lib/ORG 下,则可以以:

import(“@.ORG.Util.Image”);import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。

 

访问验证码

可以直接在浏览器里访问该验证码方法以确定验证码是否能正常显示: 

http://127.0.0.1/index.php/Public/verify 

如果一切正常,显示验证码如下所示: 

 

表单中使用验证码

在表单页面中使用验证码,是以html img 标签来调用: 

<inputtype=“text”name=“verify”>
<imgid=“verifyImg”src=“__URL__/verify”onClick=changeVerify()title=“点击刷新验证码”/>

src 属性值即为验证码方法访问地址,视实际情况不同而不同。 

 

验证码刷新

当点击验证码图片时,触发 JavaScript changeVerify() 函数重新读取验证码,从而实现验证码刷新。该函数参考如下: 

<scriptlanguage=“JavaScript”>
functionchangeVerify(){

vartimenow =newDate().getTime();
document.getElementById(‘verifyImg’).src=‘__URL__/verify/’+timenow;
}
</script>

 

验证码验证

在调用验证码 verify 的时候,buildImageVerify 会记录本次验证码的 MD5 信息。在表单验证操作里,以如下方法来检查验证码是否正确: 

if($_SESSION[‘verify’]!=md5($_POST[‘verify’])){

$this->error(‘验证码错误!’);
}

其中 $_SESSION[‘verify’] 中的 verify 名称为 buildImageVerify 方法默认 SESSION 注册名称,具体见 buildImageVerify 语法。 

 

=================================

 

使用其他风格验证码

buildImageVerify 方法生成验证码时,根据不同参数,可以生成不同风格的验证码。

buildImageVerify()

buildImageVerify 方法语法如下: 

buildImageVerify(length,mode,type,width,height,verifyName)

 

参数说明: 

length验证码字符个数,默认为 4 位。

mode验证码字符类型,默认为数字。

其他支持类型有:0字母 1数字 2大写字母 3小写字母 4中文 5混合(去掉了容易混淆的字符oOLl和数字01)。

type验证码的图片类型,默认为 png 。

width验证码图片的宽度,默认根据验证码长度自动计算。

height验证码图片的高度,默认为 22px 。

verifyName验证码的 SESSION 注册名称,默认为 verify 。

 

因此可以根据参数构造出其他风格的验证码,如: 

// 5位数字
Image::buildImageVerify(5);
// 5位大写字母
Image::buildImageVerify(5,2);
// 6位大小写字母与数字混合
Image::buildImageVerify(6,5);

 

中文验证码

buildImageVerify 方法不支持中文验证码的显示,要使用中文验证码,需要使用 GBVerify 方法。 

buildImageVerify()

buildImageVerify 方法语法如下: 

GBVerify(length,type,width,height,fontface,verifyName)

 

 

参数说明: 

length验证码字符个数,默认为 4 位。

type验证码的图片类型,默认为 png 。

width验证码图片的宽度,默认根据验证码长度自动计算。

height验证码图片的高度,默认为 50px 。

fontface使用的字体文件,使用包含路径的完整文件名或者将字体文件放到图像类(Image.class.php)同目录下,默认使用的字体文件是 simhei.ttf (存在于 windows 的 Fonts 目录下)。

verifyName验证码的 SESSION 注册名称,默认为 verify 。

例子: 

Publicfunctionverify(){

import(“ORG.Util.Image”);
Image::GBVerify();
}

 

 

如果数字英文的验证码能正常显示而不能显示中文验证码,那很可能是没有读取到正确的字体文件。将 simhei.ttf 文件拷贝至 Image.class.php 同目录(ThinkPHP目录/Lib/ORG/Util/)下即可。

ThinkPHP 验证码目前不支持大小写英文混合(无数字)以及中英文混合的验证码。 

 

 

应用实例:

HTML+JavaScript代码:

<script type=”text/javascript”>
functionchangeVerify(obj){

vartimenow =newDate().getTime();
obj.src =obj.src+’&time=’+timenow;
}
</script>

<table border=”0″ cellspacing=”0″ style=”text-align:left;”>
<tr>
<td style=”text-align:right;”>生成图片验证码:</td><td><img src=”__URL__/ImageVerify?type=1″onClick=”changeVerify(this)”title=”点击刷新验证码”/></td>
</tr>
<tr>
<td style=”text-align:right;”>中文验证码:</td><td><img src=”__URL__/ImageVerify?type=2″onClick=”changeVerify(this)”title=”点击刷新验证码”/></td>
</tr>
<tr>
<td style=”text-align:right;”>生成高级图像验证码:</td><td><img src=”__URL__/ImageVerify?type=3″onClick=”changeVerify(this)”title=”点击刷新验证码”/></td>
</tr>
<tr>
<td style=”text-align:right;”>生成UPC-A条形码:</td><td><img src=”__URL__/ImageVerify?type=4″onClick=”changeVerify(this)”title=”点击刷新验证码”/></td>
</tr>
<tr>
<td style=”text-align:right;”>根据给定的字符串生成图像:</td><td><img src=”__URL__/ImageVerify?type=5″onClick=”changeVerify(this)”title=”点击刷新验证码”/></td>
</tr>
</table>

PHP代码:

//验证码
functionImageVerify(){

import(“@.ORG.Util.Image”);
$type =isset($_GET[‘type’])?intval($_GET[‘type’]):1;

switch($type){

case1:
Image::buildImageVerify();//生成图片验证码
break;
case2:
Image::GBVerify();//中文验证码
break;
case3:
Image::showAdvVerify();//生成高级图像验证码
break;
case4:
$verify =self::GetRandChar(11);
Image::UPCA($verify);//生成UPC-A条形码
break;
case5:
$verify =self::GetRandChar();
Image::buildString($verify);//根据给定的字符串生成图像
break;
}
}

//生成指定长度的验证码
functionGetRandChar($length =4){

$str =’123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ’;
$result =”;
$l =strlen($str)-1;
$num=0;

for($i =0;$i <$length;$i ++){

$num =rand(0,$l);
$a=$str[$num];
$result =$result.$a;
}
return$result;
}

转载于:https://my.oschina.net/guomingliang/blog/265139

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109827.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 指针函数与函数指针

    指针函数与函数指针1.指针函数先看下面的函数声明,注意,此函数有返回值,返回值为int*,即返回值是指针类型的。int*f(inta,intb);上面的函数声明又可以写成如下形式:int*f(inta,intb);让指针标志*与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,f是函数名,返回值类型是一个int类型的指针。下面看指针函数的实现:in

    2022年6月22日
    25
  • python神经网络图像识别note

    python神经网络图像识别noteBP神经网络手写数字识别mnist测试集(28*28)识别mnist训练集60000个样本,测试集10000个样本,发现使用4层BP神经网络784,50,20,10没有3层神经网络784,100,10识别率高.只有88%左右对自己手写的样本更差.先是处理了手写样本的背景色噪声,但是仍然很差,估计1.mnist训练集中对数字图像位置进行了居中,大小进行了统一,自己手写的样本没有做相应…

    2022年5月12日
    36
  • nginx报错”worker_processes” directive is duplicate

    nginx报错”worker_processes” directive is duplicatenginx报错”worker_processes” directive is duplicate

    2022年4月24日
    52
  • 完全卸载flash浏览器插件_浏览器内置flash卸载

    完全卸载flash浏览器插件_浏览器内置flash卸载前天晚上不知道点到了什么东西,弹出来个窗口说浏览器的Flash插件需要升级,当时也没多想就确定了,结果发现QQ2009一开就崩溃,囧……找了半天发现问题出在升级的这个Flash插件上面,于是在控制面板中卸载掉,重新安装——一开QQ继续崩溃,继续囧……再查,发现在控制面板中卸载Flash插件之后,在C:\Windows\System32\Macromed\Flash\依旧存在两个文…

    2022年10月15日
    2
  • python deepcopy「建议收藏」

    python deepcopy「建议收藏」1.copy.copy浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象。2.copy.deepcopy深拷贝拷贝对象及其子对象一个很好的例子:import copya = [1, 2, 3, 4, [‘a’, ‘b’]]  #原始对象b = …

    2022年10月2日
    2
  • redis面试必会6题经典_关于redis秒杀的面试题

    redis面试必会6题经典_关于redis秒杀的面试题Redis面试题1、什么是Redis?.2、Redis的数据类型?3、使用Redis有哪些好处?4、Redis相比Memcached有哪些优势?5、Memcache与Redis的区别都有哪些?6、Redis是单进程单线程的?7、一个字符串类型的值能存储最大容量是多少?8、Redis的持久化机制是什么?各自的优缺点?9、Redis常见性…

    2025年8月26日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号