ThinkPHP(SAE)調用驗證碼不能正確調用驗證碼

來源:互聯網
上載者:User

標籤:

現在,將官網的方法貼出:

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控制器類中為例,代碼如下:

  1. class PublicAction extends Action{
  2.     Public function verify(){
  3.         import(‘ORG.Util.Image‘);
  4.         Image::buildImageVerify();
  5.     }
  6. }
複製代碼

定義後,我們可以在任何需要驗證碼的模組中調用Public模組的verify方法來顯示驗證碼,需要做的僅僅是在需要的模板中添加如下調用代碼:

  1. <img src=‘!-APP-!/Public/verify/‘ />
複製代碼

這樣,我們訪問該頁面後就能看到預設的驗證碼映像顯示,如下所示:

如果你的驗證碼不能正常顯示,請檢查:

  1. 是否已經安裝GD庫支援並正常開啟;
  2. Image類庫以及String類庫是否在正確的位置以及是否正確匯入;
  3. 驗證碼輸出之前是否有任何的其他輸出(尤其是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中使用下面的代碼判斷就行了:

  1. if(session(‘verify‘) != md5($_POST[‘verify‘])) {
  2.    $this->error(‘驗證碼錯誤!‘);
  3. }
複製代碼

建議使用session方法來擷取SESSION值,因為驗證碼產生方法裡面也是採用的session方法儲存的,可以避免受session首碼的影響而出錯。這裡的verify名稱取決於你的驗證碼的verifyName參數的值。
如果你的session功能不正常,可能會導致驗證碼檢測報錯的情況發生。

中文驗證碼

BuildImageVerify方法不支援中文驗證碼的顯示,如果需要顯示中文驗證碼,請使用GBVerify方法,用法樣本:

  1. Public function verify(){
  2.     import("ORG.Util.Image");
  3.     Image::GBVerify();
  4. }
複製代碼

顯示效果如下:

如果能夠顯示圖片,但是看不到圖片中的中文字元,請檢查是否有拷貝字型檔到映像類庫所在目錄。預設使用的字型檔是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方法來控制驗證碼的重新整理,例如下面可以實現點擊驗證碼圖片重新整理驗證碼:

  1. <script language="JavaScript">
  2. function fleshVerify(){ 
  3.     //重載驗證碼
  4.     var time = new Date().getTime();
  5.         document.getElementById(‘verifyImg‘).src= ‘!-APP-!/Public/verify/‘+time;
  6. }
  7. </script>
  8. <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)調用驗證碼不能正確調用驗證碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.