当前位置:首页 > CMS教程 > 其它CMS > 列表

Yii1.0 不同页面多个验证码的使用实现

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-19 09:20:18 浏览: 评论:0 

当业务A页面有验证码,且业务B页面也需要验证码,这个时候,如果A和B共用一个验证码,则会出现这种情况:

A页面出现验证码,这个时候打开B页面验证码,再回到A页面输入验证码,即使验证码输入无误,也会验证不通过。因为A和B共用一个验证码,也就是验证码存储的session是一个,这样对用户体验很不好。

解决方法如下:

HTML代码

  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4.   <title>业务A的验证码页面</title> 
  5. </head> 
  6. <body> 
  7.   <img src="" alt="验证码" id="imgValCode"> 
  8. </body> 
  9. </html> 
  10.  <script src="jquery.js"></script> 
  11.   <script type="text/javascript"> 
  12.   $.ajax({ 
  13.     url: '/Captcha/A/refresh', //不同业务模块调用不同的url B业务调用/Captcha/B/refresh 
  14.     type: 'get', 
  15.     dataType: 'json', 
  16.     async: true, 
  17.     success:function(data) { 
  18.       if ( data.src ) { 
  19.         $('#imgValCode').attr('src',data.src); 
  20.       } 
  21.     } 
  22.   }); 
  23. </script> 

PHP代码

  1. <?php 
  2. /** 
  3.  * yii1.0 验证码类 
  4.  * 多个验证码,方式业务A页面和业务B页面同时打开,共用一个验证码session,导致其中一个被失效的问题 
  5.  */ 
  6. class CaptchaController extends CHttpModuleController  
  7.   /** 
  8.    * 验证码生成函数 
  9.    */ 
  10.   public function actions()  
  11.   { 
  12.     return [ 
  13.       //A业务验证码 
  14.       'A' => [ 
  15.         'class' => 'application.components.MyCaptcha.MyCaptchaAction'
  16.         'backColor' => 0xFFFFFF, 
  17.         'minLength' => 5, 
  18.         'maxLength' => 5, 
  19.         'offset' => 5, 
  20.         'testLimit' => 1, 
  21.         'width' => 100, 
  22.         'height' => 40, 
  23.         'isInterferingLine' => true, //是否启用干扰线 
  24.         'interferingLineNumber' => 8, //干扰线数量设置 
  25.         'foreColor' => '0x0c0c0e' 
  26.       ], 
  27.       //B业务验证码 
  28.       'B' => [ 
  29.         'class' => 'application.components.MyCaptcha.MyCaptchaAction'
  30.         'backColor' => 0xFFFFFF, 
  31.         'minLength' => 5, 
  32.         'maxLength' => 5, 
  33.         'offset' => 5, 
  34.         'testLimit' => 1, 
  35.         'width' => 100, 
  36.         'height' => 40, 
  37.         'isInterferingLine' => false, //是否启用干扰线 
  38.         'interferingLineNumber' => 8, //干扰线数量设置 
  39.         'foreColor' => '0x0c0c0e' 
  40.       ] 
  41.     ]; 
  42.   } 
  43.  
  44.   /** 
  45.    * 验证码验证函数 
  46.    * 在需要验证验证码的控制器中调用,传递businessId(业务类型id)作为区分不同验证码的id 
  47.    * 调用方式: 
  48.    * Yii::app()->runController('Captcha/actionVerifyCode',[ 'businessId' => 'A' ]); 
  49.    */ 
  50.   public function actionVerifyCode($businessId)  
  51.   { 
  52.     $code = Yii::app()->request->getPost('code');        //接收用户输入的验证码 
  53.     if ( $businessId == 'A' ) { 
  54.       $vcode = $this->createAction('A')->getVerifyCode();   //获取A业务的验证码 
  55.     } else if ( $businessId == 'B' ) { 
  56.       $vcode = $this->createAction('B')->getVerifyCode();   //获取B业务的验证码 
  57.     } 
  58.     if ( emptyempty($vcode) || emptyempty($code) || $vcode != $code ) {  //验证用户输入验证码与验证码是否相等 
  59.       return false;    //验证不通过 
  60.     } 
  61.     return true;  //验证通过 
  62.   } 
  63. ?>

Tags: Yii1.0验证码

分享到: