• 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

  • 相关阅读:
    372. Super Pow
    桌面远程连接:发生身份验证错误,要求的函数不受支持
    Web Service代理类生成工具
    Razor语法大全
    Web Serveice服务代理类生成及编译
    配置WCF Test Client
    我与春风皆过客,你携秋水揽星河
    机器学习(十三) 集成学习和随机森林(下)
    机器学习(十三) 集成学习和随机森林(上)
    机器学习(十二) 决策树(下)
  • 原文地址:https://www.cnblogs.com/debmzhang/p/3982075.html
Copyright © 2020-2023  润新知