標籤:
現在,將官網的方法貼出:
SAE下使用ThinkPHP驗證碼,非SaeVcode
SaeVcode其實很弱弱,連驗證碼的尺寸都不能設定,對於開發和美工來說,是件很頭痛的事情,經過我們技術員簡單測試,發現ThinkPHP內建的驗證碼是可以在SAE下正常啟動並執行。
1、將“ThinkPHP\Extend\Library\ORG\Util\String.class.php”拷貝至“
ThinkPHP\Extend\Engine\Sae\Lib\Extend\Library\ORG\Util\String.class.php“;
2、刪除“ThinkPHP\Extend\Engine\Sae\Lib\Extend\Library\ORG\Util\Image_sae.class.php”中“buildImageVerify”函數;
3、將“ThinkPHP\Extend\Library\ORG\Util\Image.class.php”中“buildImageVerify”函數拷貝至“ThinkPHP\Extend\Engine\Sae\Lib\Extend\Library\ORG\Util\Image_sae.class.php”即可。
驗證方式和產生驗證碼等都不用修改,和本地開發一樣使用。
供開發人員參考,錯誤之處請指教!
因為筆者是剛剛用TP的新手,所以又看了下:
ThinkPHP3.1快速入門(20)驗證碼
在這個網路安全漫天飛的年代,驗證碼功能起碼能算是一個值得信賴的好衛兵了。本篇我們就來講下如何在ThinkPHP中使用驗證碼功能。
擷取擴充類庫
ThinkPHP的擴充中由影像處理類Image以及用於產生隨機驗證碼的字元處理類String共同完成驗證碼功能,可以在在http://www.thinkphp.cn/extend/225.html下載影像處理類以及http://www.thinkphp.cn/extend/266.html下載字元處理類,或者下載官方的完整擴充包(http://www.thinkphp.cn/down/253.html)裡面也已經包含以上擴充類了。如果是單獨下載的擴充類庫,把解壓後的Image.class.php和String.class.php 一起放入ThinkPHP/Extend/Library/ORG/Util/(如果沒有請手動建立)目錄下面。由於驗證碼顯示採用了GD庫支援,所以需要環境支援GD庫。
產生驗證碼
產生驗證碼其實很簡單,只需要在你的Action中添加操作方法,一般為了避免受許可權控制的影響,我們通常把這個方法放到公用Action或者無需授權就能訪問的控制器(例如PublicAction)中,下面我們以放到PublicAction控制器類中為例,代碼如下:
- class PublicAction extends Action{
- Public function verify(){
- import(‘ORG.Util.Image‘);
- Image::buildImageVerify();
- }
- }
複製代碼
定義後,我們可以在任何需要驗證碼的模組中調用Public模組的verify方法來顯示驗證碼,需要做的僅僅是在需要的模板中添加如下調用代碼:
- <img src=‘!-APP-!/Public/verify/‘ />
複製代碼
這樣,我們訪問該頁面後就能看到預設的驗證碼映像顯示,如下所示:
如果你的驗證碼不能正常顯示,請檢查:
- 是否已經安裝GD庫支援並正常開啟;
- Image類庫以及String類庫是否在正確的位置以及是否正確匯入;
- 驗證碼輸出之前是否有任何的其他輸出(尤其是UTF8的BOM頭資訊輸出);
很多開發人員驗證碼無法顯示的情況多數是由於檔案中有輸出或者BOM頭的情況,關於UTF8的BOM頭檢測有工具可以檢測,很多編輯器也支援去掉BOM儲存(這個不清楚的話可以百度下)。這裡要另外強調下很多開發人員在書寫代碼的時候不夠規範,例如經常會有下面的情形發生:
在檔案的開頭有空行
在檔案的尾部有空行
以上兩種情況都會導致頁面的其他輸出,從而導致驗證碼出錯。
驗證碼顯示設定
預設情況下,驗證碼採用隨機的4位元字顯示,我們可以通過參數來設定不同的顯示方式,Image類的buildImageVerify方法用法如下:
| buildImageVerify 產生映像驗證碼 |
| 用法 |
buildImageVerify($length,$mode,$type,$width,$height,$verifyName) |
| 參數 |
length |
驗證碼的長度,預設為4位元 |
| model |
驗證字串的類型,預設為數字,其他支援類型有0 字母 1 數字 2 大寫字母 3 小寫字母 4中文 5混合 |
| type |
驗證碼的圖片類型,預設為png |
| width |
驗證碼的寬度,預設會自動根據驗證碼長度自動計算 |
| height |
驗證碼的高度,預設為22 |
| verifyName |
驗證碼的SESSION記錄名稱,預設為verify |
驗證輸入
每次產生驗證碼的時候,就會通過SESSION記錄本次的驗證碼的md5後的字串資訊,所以,要檢查驗證碼是否正確,我們只需要在Action中使用下面的代碼判斷就行了:
- if(session(‘verify‘) != md5($_POST[‘verify‘])) {
- $this->error(‘驗證碼錯誤!‘);
- }
複製代碼
建議使用session方法來擷取SESSION值,因為驗證碼產生方法裡面也是採用的session方法儲存的,可以避免受session首碼的影響而出錯。這裡的verify名稱取決於你的驗證碼的verifyName參數的值。
如果你的session功能不正常,可能會導致驗證碼檢測報錯的情況發生。
中文驗證碼
BuildImageVerify方法不支援中文驗證碼的顯示,如果需要顯示中文驗證碼,請使用GBVerify方法,用法樣本:
- Public function verify(){
- import("ORG.Util.Image");
- Image::GBVerify();
- }
複製代碼
顯示效果如下:
如果能夠顯示圖片,但是看不到圖片中的中文字元,請檢查是否有拷貝字型檔到映像類庫所在目錄。預設使用的字型檔是simhei.ttf(該檔案可以從window的Fonts目錄下面找到)。
GBVerify方法也有不同的參數用於設定驗證碼,具體用法如下:
| GBVerify產生中文驗證碼 |
| 用法 |
GBVerify ($length,$type,$width,$height,$fontface,$verifyName) |
| 參數 |
length:驗證碼的長度,預設為4位元 type:驗證碼的圖片類型,預設為png width:驗證碼的寬度,預設會自動根據驗證碼長度自動計算 height:驗證碼的高度,預設為50 fontface:使用的字型檔,使用完整檔案名稱或者放到映像類所在的目錄下面,預設使用的字型檔是simhei.ttf(該檔案可以從window的Fonts目錄下面找到 verifyName:驗證碼的SESSION記錄名稱,預設為verify |
驗證碼重新整理
如果隨機產生的驗證碼看不清楚,就需要添加驗證碼重新整理功能來重建,這個其實只是修改前端代碼,背景驗證碼產生方法無需修改。
一般我們是用js方法來控制驗證碼的重新整理,例如下面可以實現點擊驗證碼圖片重新整理驗證碼:
- <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()" />
複製代碼
當然,熟悉Jquery的開發人員,可以用Jquery代碼來簡化驗證碼重新整理的js方法,這個就不再多說了。
看了這兩篇文章後,開始著手調用SAE下的驗證碼:
首先,按照第一篇,替換函數和檔案;
然後,按照正常調用驗證碼的方式調用:
<?php class PublicAction extends Action{ public function verify(){import(‘ORG.Util.Image_sae‘);Image::buildImageVerify();} }?>
模板頁調用:
<form action="" method="post"> <p>使用者名稱:<input type="text" name="user" /></p> <p>密 碼 :<input type="password" name="pwd" /></p> <p>驗證碼:<input type="text" name="checkcode" /><img src="{:U(‘Public/verify‘,‘‘,‘‘)}" /></p> <p><input name="submit" type="submit" value="登入" /><input type="reset" value="取消" /></p> </form>
但是,問題來了:
圖片不能正常顯示,查看映像
通過上面的代碼也知道,PublicAction是繼承的 Action基類,於是,開啟ThinkPHP/Lib/Core/Action.class.php,尋找Image類,沒有找到!!!
然後,開啟Image_sae.class.php,這裡面是包含class類的,也是說:import函數,沒有匯入成功!
於是,我開始查看import的路徑是否引用正確,發現APP/ORG/Image.class.php檔案,然後修改代碼,如下:
<?php class PublicAction extends Action{ public function verify(){import(‘APP/ORG.Image‘);Image::buildImageVerify();} }?>
結果:
問題解決,當別人不鳥你的時候,就應該百度,自己嘗試了!
ThinkPHP(SAE)調用驗證碼不能正確調用驗證碼