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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

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