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)
上一篇 2021年8月29日 下午5:00
下一篇 2021年8月29日 下午6:00


相关推荐

  • phantomjs 简介「建议收藏」

    phantomjs 简介「建议收藏」在爬虫、自然语言处理群320349384中的交流中,偶然接触到phantomjs、casper等相对于httpclient较新的框架及采集解决方案,微查之后发现方案可行,故尽清明三日之力,将其二次开发应用于百度元搜索信息采集项目中,达到预期效果,下一步将重点应用到腾讯微博采集和抢票抢手机项目中。下面,将分步骤介绍一下。  一、phantomjs介绍   (1)一个基于web

    2022年7月26日
    11
  • 前端缓存(HTTP缓存、浏览器缓存)浅析

    前端缓存(HTTP缓存、浏览器缓存)浅析前端缓存文章目录前端缓存缓存分类 1 http 缓存 1 强缓存 本地缓存 启发式缓存 2 协商缓存 弱缓存 2 浏览器缓存其他响应头和请求头参数刷新正常重新加载硬性重新加载清空缓存并硬性重新加载调试缓存缓存分类 1 http 缓存浏览器请求流程 1 强缓存 本地缓存 是否使用强缓存 由请求头中的如下参数决定 Expires 格式是 Fri 24Dec 24 07GMT 旧的规范 优先级比较低 Pragma 只有一个值 no cache 和 Cache Control 的 no

    2026年3月16日
    1
  • 阿里p7架构师力荐《Android性能优化—实战解析》,全方面解析Android性能优化

    阿里p7架构师力荐《Android性能优化—实战解析》,全方面解析Android性能优化前言 Android 已经融入了寻常百姓的生活中 当今世界 手机正从功能时代进化到智能时代 同时又诞生了令人爱不释手的平板电脑 目前 应用程序开发者的可选择平台主要就是 Android 和 iOSAndroid 降低了甚至可以说是打破了移动开发的门槛 应用程序开发者编写 Android 应用程序只需要一台计算机就够了 当然还要有一些编程知识 工具都是免费的 几乎每个人都能写出数百万人会用的应用 Android 可以运行在各种设备上 从平板到电视 开发者关键要做的就是保证应用可以顺利地在这些设备上运行 而且比竞争对手的

    2025年11月12日
    3
  • selenium的PO模式

    selenium的PO模式PageObject模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class(封装在一个class类中),其中包含页面中需要测试的所有元素(按钮,输入框,标题等)的属性和操作,这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。当页面元素id变化时,只需要更改测试页Class中页面的属…

    2022年5月20日
    71
  • 什么是bin文件?「建议收藏」

    什么是bin文件?「建议收藏」出现这样的问题:未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件。原因可能是:1.路径不正确;2.文件不存在。相信大家都遇到这样的问题了,我和大家一样按照常规的方法:把DAL的路径改到E:\4.平时记录\UI\机房重构\UI\bin\Debug下面了,一般这样就可以解决了。但是,我的没有解决。bin\Debug下面仍让没有有关DAL的dll文件。不

    2022年4月19日
    42
  • 计算机的发展历史_计算器的由来和故事

    计算机的发展历史_计算器的由来和故事本文主要介绍计算机的发展历史。1概述计算工具的演化经历了由简单到复杂、从低级到高级的不同阶段,从“结绳记事”中的绳结到算筹、算盘、计算尺、机械计算机等,它们在不同的历史时期发挥了各自的历史作用,同时也启发了现代电子计算机的研制思想。1889年,美国科学家赫尔曼·何乐礼研制出以电力为基础的电动制表机,用以储存计算资料。1930年,美国科学家范内瓦·布什造出世界上首台模拟电子计算机。…

    2022年8月31日
    3

发表回复

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

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