在這個網(wǎng)絡(luò)安全漫天飛的年代,驗證碼功能起碼能算是一個值得信賴的好衛(wèi)兵了。本篇我們就來講下如何在ThinkPHP中使用驗證碼功能。
獲取擴(kuò)展類庫
ThinkPHP的擴(kuò)展中由圖像處理類Image以及用于生成隨機(jī)驗證碼的字符處理類String共同完成驗證碼功能,可以在在http://www.thinkphp.cn/extend/225.html下載圖像處理類以及http://www.thinkphp.cn/extend/266.html下載字符處理類,或者下載官方的完整擴(kuò)展包(http://www.thinkphp.cn/down/253.html)里面也已經(jīng)包含以上擴(kuò)展類了。如果是單獨(dú)下載的擴(kuò)展類庫,把解壓后的Image.class.php和String.class.php 一起放入ThinkPHP/Extend/Library/ORG/Util/(如果沒有請手動創(chuàng)建)目錄下面。
由于驗證碼顯示采用了GD庫支持,所以需要環(huán)境支持GD庫。生成驗證碼
生成驗證碼其實很簡單,只需要在你的Action中添加操作方法,一般為了避免受權(quán)限控制的影響,我們通常把這個方法放到公共Action或者無需授權(quán)就能訪問的控制器(例如PublicAction)中,下面我們以放到PublicAction控制器類中為例,代碼如下:
class PublicAction extends Action{
Public function verify(){
import('ORG.Util.Image');
Image::buildImageVerify();
}
}
定義后,我們可以在任何需要驗證碼的模塊中調(diào)用Public模塊的verify方法來顯示驗證碼,需要做的僅僅是在需要的模板中添加如下調(diào)用代碼:
<img src='!-APP-!/Public/verify/' />
這樣,我們訪問該頁面后就能看到默認(rèn)的驗證碼圖像顯示,如下所示:

如果你的驗證碼不能正常顯示,請檢查:
- 是否已經(jīng)安裝GD庫支持并正常開啟;
- Image類庫以及String類庫是否在正確的位置以及是否正確導(dǎo)入;
- 驗證碼輸出之前是否有任何的其他輸出(尤其是UTF8的BOM頭信息輸出);
很多開發(fā)人員驗證碼無法顯示的情況多數(shù)是由于文件中有輸出或者BOM頭的情況,關(guān)于UTF8的BOM頭檢測有工具可以檢測,很多編輯器也支持去掉BOM保存(這個不清楚的話可以百度下)。這里要另外強(qiáng)調(diào)下很多開發(fā)人員在書寫代碼的時候不夠規(guī)范,例如經(jīng)常會有下面的情形發(fā)生:
在文件的開頭有空行

在文件的尾部有空行

以上兩種情況都會導(dǎo)致頁面的其他輸出,從而導(dǎo)致驗證碼出錯。
驗證碼顯示設(shè)置
默認(rèn)情況下,驗證碼采用隨機(jī)的4位數(shù)字顯示,我們可以通過參數(shù)來設(shè)置不同的顯示方式,Image類的buildImageVerify方法用法如下:
buildImageVerify 生成圖像驗證碼 |
用法 | buildImageVerify($length,$mode,$type,$width,$height,$verifyName) |
參數(shù) | length | 驗證碼的長度,默認(rèn)為4位數(shù) |
model | 驗證字符串的類型,默認(rèn)為數(shù)字,其他支持類型有0 字母 1 數(shù)字 2 大寫字母 3 小寫字母 4中文 5混合 |
type | 驗證碼的圖片類型,默認(rèn)為png |
width | 驗證碼的寬度,默認(rèn)會自動根據(jù)驗證碼長度自動計算 |
height | 驗證碼的高度,默認(rèn)為22 |
verifyName | 驗證碼的SESSION記錄名稱,默認(rèn)為verify |
驗證輸入
每次生成驗證碼的時候,就會通過SESSION記錄本次的驗證碼的md5后的字符串信息,所以,要檢查驗證碼是否正確,我們只需要在Action中使用下面的代碼判斷就行了:
if(session('verify') != md5($_POST['verify'])) {
$this->error('驗證碼錯誤!');
}
建議使用session方法來獲取SESSION值,因為驗證碼生成方法里面也是采用的session方法保存的,可以避免受session前綴的影響而出錯。這里的verify名稱取決于你的驗證碼的verifyName參數(shù)的值。
如果你的session功能不正常,可能會導(dǎo)致驗證碼檢測報錯的情況發(fā)生。
中文驗證碼
BuildImageVerify方法不支持中文驗證碼的顯示,如果需要顯示中文驗證碼,請使用GBVerify方法,用法示例:
Public function verify(){
import("ORG.Util.Image");
Image::GBVerify();
}
顯示效果如下:

如果能夠顯示圖片,但是看不到圖片中的中文字符,請檢查是否有拷貝字體文件到圖像類庫所在目錄。默認(rèn)使用的字體文件是simhei.ttf(該文件可以從window的Fonts目錄下面找到)。
GBVerify方法也有不同的參數(shù)用于設(shè)置驗證碼,具體用法如下:
GBVerify生成中文驗證碼 |
用法 | GBVerify ($length,$type,$width,$height,$fontface,$verifyName) |
參數(shù) | length:驗證碼的長度,默認(rèn)為4位數(shù) type:驗證碼的圖片類型,默認(rèn)為png width:驗證碼的寬度,默認(rèn)會自動根據(jù)驗證碼長度自動計算 height:驗證碼的高度,默認(rèn)為50 fontface:使用的字體文件,使用完整文件名或者放到圖像類所在的目錄下面,默認(rèn)使用的字體文件是simhei.ttf(該文件可以從window的Fonts目錄下面找到 verifyName:驗證碼的SESSION記錄名稱,默認(rèn)為verify |
驗證碼刷新
如果隨機(jī)生成的驗證碼看不清楚,就需要添加驗證碼刷新功能來重新生成,這個其實只是修改前端代碼,后臺的驗證碼生成方法無需修改。
一般我們是用js方法來控制驗證碼的刷新,例如下面可以實現(xiàn)點擊驗證碼圖片刷新驗證碼:
<script language="JavaScript">
function fleshVerify(){
//重載驗證碼
var time = new Date().getTime();
document.getElementById('verifyImg').src= '!-APP-!/Public/verify/'+time;
}
</script>
<img id="verifyImg" src='!-APP-!/Public/verify/' onclick="fleshVerify()" />
當(dāng)然,熟悉Jquery的開發(fā)人員,可以用Jquery代碼來簡化驗證碼刷新的js方法,這個就不再多說了。