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)


相关推荐

  • latex中怎么输出双引号

    latex中怎么输出双引号在texstudio中,我们输入这个”we”,输出的pdf中会是这样同向的双引号 这是由于方式不对,应该是这样写“we”,左边的那个符号是在键盘上“ESC”下面那个以前没有注意到的一个符号,开启中文方式是这个符号“·”,英文输出是”`”,we右边就是常见的双引号,输出如图所示。 …

  • Linux下区分物理CPU、逻辑CPU和CPU核数

    Linux下区分物理CPU、逻辑CPU和CPU核数

  • (毕业设计资料)基于单片机SPWM逆变器电源系统设计

    (毕业设计资料)基于单片机SPWM逆变器电源系统设计输出:正弦波频率:可调;幅值:可调;逆变原理:51单片机SPWM驱动H桥+后级滤波;调节方式:频率加按键、频率减按键、幅值加按键、幅值减按键;频率调节范围:10hz、20hz、30hz、40hz、50hz、60hz、70hz、80hz、100hz;幅值调节范围:0%,10%,20%,30%,40%,50%,60%,70%,80%,90%,100%;(输出峰值占输入电压百分比)输出最大电流:2A;过流打嗝保护:过流保护值2A,过流时切断,5秒后尝试恢复输出;输入电压范围:

  • java最简单最全入门基础笔记(不简单,不全你打我)「建议收藏」

    java最简单最全入门基础笔记(不简单,不全你打我)「建议收藏」刚开始学习java的时候,可能是一头雾水,不知道从何学起,这里跟大家分享一下!(仅仅只供初级学者学习,大佬勿喷)一、初始java1.生活中的程序:从起床到教室上课的过程穿衣打扮》起床》洗漱》出宿舍》》吃早餐》到教室按照特定的顺序去完成某一件事的过程我们叫做生活中的程序2.计算机中的程序:一组有序指令的集合,需要和计算机交流就要使用计算机语言,java就是计算机语言的一种3.java…

  • 2020年到来,还不为来年的Python面试做准备?

    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要给大家介绍一些Python面试题,例如:迭代器和生成器的区别;什么是线程安全;什么是私有变量;内置变量;函数和方法;类;模块和包等等问题。

  • 使用decode函数

    使用decode函数Decode函数使用:Oracle的decode函数蛮有意思,是oracle独有的,国际标准SQL中并没有decode函数。语法DECODE(col|expression,search1,result1[,search2,result2,…,][,default])例子SELECTproduct_id,DECODE(warehouse_id,1…

发表回复

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

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