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

2020-09-01 12:37:17

当业务A页面有验证码,且业务B页面也需要验证码。这个时候,如果A和B共用一个验证码,则会出现这种情况:
A页面出现验证码,这个时候打开B页面验证码,再回到A页面输入验证码,即使验证码输入无误,也会验证不通过。因为A和B共用一个验证码,也就是验证码存储的session是一个,这样对用户体验很不好。
解决方法如下:

HTML代码

<!DOCTYPE html><html><head>  <title>业务A的验证码页面</title></head><body>  <img src="" alt="验证码" id="imgValCode"></body></html> <script src="jquery.js"></script>  <script type="text/javascript">  $.ajax({    url: '/Captcha/A/refresh', //不同业务模块调用不同的url B业务调用/Captcha/B/refresh    type: 'get',    dataType: 'json',    async: true,    success:function(data) {      if ( data.src ) {        $('#imgValCode').attr('src',data.src);      }    }  });</script>

PHP代码

<?php/** * yii1.0 验证码类 * 多个验证码,方式业务A页面和业务B页面同时打开,共用一个验证码session,导致其中一个被失效的问题 */class CaptchaController extends CHttpModuleController {  /**   * 验证码生成函数   */  public function actions()   {    return [      //A业务验证码      'A' => [        'class' => 'application.components.MyCaptcha.MyCaptchaAction',        'backColor' => 0xFFFFFF,        'minLength' => 5,        'maxLength' => 5,        'offset' => 5,        'testLimit' => 1,        'width' => 100,        'height' => 40,        'isInterferingLine' => true, //是否启用干扰线        'interferingLineNumber' => 8, //干扰线数量设置        'foreColor' => '0x0c0c0e'      ],      //B业务验证码      'B' => [        'class' => 'application.components.MyCaptcha.MyCaptchaAction',        'backColor' => 0xFFFFFF,        'minLength' => 5,        'maxLength' => 5,        'offset' => 5,        'testLimit' => 1,        'width' => 100,        'height' => 40,        'isInterferingLine' => false, //是否启用干扰线        'interferingLineNumber' => 8, //干扰线数量设置        'foreColor' => '0x0c0c0e'      ]    ];  }  /**   * 验证码验证函数   * 在需要验证验证码的控制器中调用,传递businessId(业务类型id)作为区分不同验证码的id   * 调用方式:   * Yii::app()->runController('Captcha/actionVerifyCode',[ 'businessId' => 'A' ]);   */  public function actionVerifyCode($businessId)   {    $code = Yii::app()->request->getPost('code');        //接收用户输入的验证码    if ( $businessId == 'A' ) {      $vcode = $this->createAction('A')->getVerifyCode();   //获取A业务的验证码    } else if ( $businessId == 'B' ) {      $vcode = $this->createAction('B')->getVerifyCode();   //获取B业务的验证码    }    if ( empty($vcode) || empty($code) || $vcode != $code ) {  //验证用户输入验证码与验证码是否相等      return false;    //验证不通过    }    return true;  //验证通过  }}?>
相关文章 大家在看