zoukankan      html  css  js  c++  java
  • yii 验证码那点事儿

    今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息

    关于yii验证码, framework/web/widgets/captcha/CCaptcha.php里, 它源码里有这么一部分

    >---protected function renderImage()
    >---{
    >--->---if(!isset($this->imageOptions['id']))
    >--->--->---$this->imageOptions['id']=$this->getId();
    
    >--->---$url=$this->getController()->createUrl($this->captchaAction,array('v'=>uniqid()));
    >--->---$alt=isset($this->imageOptions['alt'])?$this->imageOptions['alt']:'';
    >--->---echo CHtml::image($url,$alt,$this->imageOptions);
    >---}
    

    可以看得到, 它每个验证码的生成, 验证都是附着于当前控制器的, 所以, 对于整站通用的, 默认是行不通的. 

    换个思路, 既然知道ajax访问的路径, 那就修改默认的方法, 让其载入时, 都访问同一控制器, 可以把 framework/web/widgets/captcha/CCaptcha.php 这个文件复制一份, 放至项目下的 protected/widgets 目录下, 名字自己定, 我在这里定CommonCaptcha.php, 在配置文件 main.php 里设置自动导入(import)

    <?php
    return array(
        'import' => array(
                'application.widgets.*',
        ),
    );
    
    ?>
    

    然后, 可以在复制过来的文件里搜索    'getController' , 不出意外的话, 是可以搜索到两个的.

    第一个 $url=$this->getController()->createUrl($this->captchaAction,array('v'=>uniqid()));

    可修改为 $url=Yii::app()->createUrl('/onlineService/captcha',array('v'=>uniqid()));

    第二个 $url=$this->getController()->createUrl($this->captchaAction,array(CCaptchaAction::REFRESH_GET_VAR=>true));

    可修改为 $url=Yii::app()->createUrl('/onlineService/captcha',array(CCaptchaAction::REFRESH_GET_VAR=>true));

    也就是不使用获取的控制器, 而是指定控制器, 指定验证码的路径. 

    然后在控制器里, 就可以使用

    $this->createAction('captcha')->getVerifyCode();

    这句代码, 在onlineService控制器里获取验证码, 然后对比post过来的验证码, 就可以了, 这样, 也无需在model里再多加一个验证的参数了.

    至此, 验证Ok

  • 相关阅读:
    【2017中国大学生程序设计竞赛
    【hdu 4333】Revolving Digits
    【hihocoder 1554】最短的 Nore0061
    【2017中国大学生程序设计竞赛
    【Codeforces Beta Round #88 C】Cycle
    【2017 Multi-University Training Contest
    【Codeforces Round #429 (Div. 2) C】Leha and Function
    【Codeforces Round #429 (Div. 2) B】 Godsend
    【Codeforces Round #429 (Div. 2) A】Generous Kefa
    Single-stack real-time operating system for embedded systems
  • 原文地址:https://www.cnblogs.com/debmzhang/p/3982075.html
Copyright © 2011-2022 走看看