zoukankan      html  css  js  c++  java
  • yii 验证码 CCaptcha的总结(转)

    今天用到yii的验证码 ccaptcha,经过在网上搜寻 找到以下例子:

    1、在controller中加入代码

    (1)启用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    public function actions()
        {
            return array(
                // 启用验证码组件
                'captcha'=>array(
                    'class'=>'CCaptchaAction',
                    'backColor'=>0xFFFFFF,
                    'maxLength'=>4,       // 最多生成几个字符
                    'minLength'=>4,       // 最少生成几个字符
                    'fixedVerifyCode' => substr(md5(time()),11,4), //每次都刷新验证码
                ),
            );
        }
    ?>

    (2)添加进入规则

    1
    2
    3
    4
    5
    6
    <?php
    array('allow',
                    'actions'=>array('captcha'),
                    'users'=>array('*'),
                ),
    ?>

    2、在model中加入代码

    (1)声明

    1
    2
    3
    <?php
    public $verifyCode;
    ?>

    (2)加入属性

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    public function attributeLabels()
        {
            return array(
                'verifyCode'=>'Verification Code',
            );
        }
    ?>

    (3)加入过滤规则

    1
    2
    3
    <?php
    array('verifyCode''captcha''allowEmpty'=>!extension_loaded('gd')),
    ?>

    3、在view中写代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php if(CCaptcha::checkRequirements()): ?>
        <div class="row">
            <?php echo $form->labelEx($model,'verifyCode'); ?>
            <div>
            <?php $this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点击换图','style'=>'cursor:pointer'))); ?>
            <?php echo $form->textField($model,'verifyCode'); ?>
            </div>
            <div class="hint">Please enter the letters as they are shown in the image above.
            <br/>Letters are not case-sensitive.</div>
            <?php echo $form->error($model,'verifyCode'); ?>
        </div>
        <?php endif; ?>
    经过测试,老是报验证码错误,经过多方 查询 

    如果在 form中开启了,这两个

     'enableAjaxValidation'=>true,
        'enableClientValidation'=>true,

    然后使用 'fixedVerifyCode' => substr(md5(time()),11,4),会导致这个问题发生,在这篇文章中,有详细描述为什么会出现这个问题的原因:http://blog.163.com/wangzhenbo85@126/blog/static/10136328220133921313479/

    使用fixedverifycode是为了解决验证码在Yii页面刷新的时候不变的问题,但是加入这个后 开启了ajax验证,就会老是出现验证码错误的情况。经过搜索,找到了一个简单解决yii页面刷新,验证码不变的方案:

    $(document).ready(function(){
        var img = new Image;
            img.onload=function(){
                $('#yw0').trigger('click');
            }
            img.src = $('#yw0').attr('src');
    });

    经测试可以,原文地址:http://www.365joomla.com/php/yiishua-xin-ye-mian-yan-zheng-ma-bu-bian-chu-li-fang-fa

    后又发现,如果form开启ajax验证,这时,如果输入错了一次验证码,再继续输入,不刷新验证码的话,就会一直出现验证码错误的情况。 一般情况是因为在设置CCaptchaAction参数时,设置了testLimit(相同验证码出现的次数。默认为3。小于等于0的值意味着不限制)为1,或则小于3,这种情况下,相同的验证码只能出现一次,而用户如果开启了ajax验证的话,填写的时候ajax验证一次已达到上限1次,提交的时候再验证一次,他会判断是否大于了testLimit的值,第二次验证testLimit会加1,显然大于了1,这时会重新生成验证码,从而出现验证码老是不正确


    解决办法:
    'testLimit'=>999,    //这里可以设置大一些,以免验证超过三次会出错.

    原文地址:http://blog.163.com/wangzhenbo85@126/blog/static/1013632822013230315743/

    经过总结可以在form中开启  'enableAjaxValidation'=>true,
        'enableClientValidation'=>true, 并正常使用yii 验证码,需要以下设置:

    controller:

    return array(
                // captcha action renders the CAPTCHA image displayed on the contact page
                'captcha'=>array(
                    'class'=>'CCaptchaAction',
                    'backColor'=>0xFFFFFF,
                    'maxLength'=>4,       // 最多生成几个字符
                    'minLength'=>4,       // 最少生成几个字符
                    'testLimit'=>999,
               
                ),);

    model:

    public $verifyCode; //声明verifycode存储验证码

    public function rules()
        {
            return array(
                // username and password are required
                array('username, password', 'required'),
                // rememberMe needs to be a boolean
                array('rememberMe', 'boolean'),
                // password needs to be authenticated
                array('password', 'authenticate'),
                // verifyCode needs to be entered correctly
                array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()), //添加此验证规则,这是是验证验证码是否一致的,不需要额外的代码就通过这条规则验  证即可
            );

    views:

    <?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array(
        'id'=>'login-form',
        'enableAjaxValidation'=>true,
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ),
    )); ?>

    <?php if(CCaptcha::checkRequirements()): ?>
        <div class="row">
            
                <div class="col-md-4"><?php echo $form->textField($model,'verifyCode',array('placeholder'=>'输入验证码')); ?></div>
                <div class="col-md-6"><?php $this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点击换图','style'=>'cursor:pointer;height:42px'))); ?></div>
        <?php echo $form->error($model,'verifyCode'); ?>
            </div>     
        <?php endif; ?>

    <?php $this->endWidget(); ?>

    <script language="javascript">
    $(document).ready(function(){
        var img = new Image;
            img.onload=function(){
                $('#yw0').trigger('click');
            }
            img.src = $('#yw0').attr('src');  //这段js解决yii验证码不刷新
    });
    </script>

     
     
  • 相关阅读:
    spring注解之@PostConstruct在项目启动时执行指定方法
    maven profile动态选择配置文件
    使用Java High Level REST Client操作elasticsearch
    ElasticSearch的基本原理与用法
    Spring Boot中使用Swagger2自动构建API文档
    Spring Aop——给Advice传递参数
    一次EF批量插入多表数据的性能优化经历
    [翻译]:SQL死锁-死锁排除
    项目中死锁的解决经历
    [翻译]:SQL死锁-为什么会出现死锁
  • 原文地址:https://www.cnblogs.com/brady-wang/p/5082625.html
Copyright © 2011-2022 走看看