yii2验证码不会在页面刷新时更改

时间:2015-12-21 18:14:03

标签: php yii2 yii2-advanced-app

我正在使用yii2高级框架的默认验证码实现。我有一个问题:每次刷新页面时我想更改我的验证码,但是当我刷新页面时,我的验证码不会改变。

7 个答案:

答案 0 :(得分:3)

最正确的解决方案是创建自己的CaptchaAction,扩展yii\captcha\CaptchaAction并覆盖run()方法,如下所示:

namespace app\actions; // Change to your own    

class CaptchaAction extends yii\captcha\CaptchaAction {
    public $autoRegenerate = true;

    public function run() 
    {
       if ($this->autoRegenerate && Yii::$app->request->getQueryParam(self::REFRESH_GET_VAR) === null) {
           $this->setHttpHeaders();
           Yii::$app->response->format = Response::FORMAT_RAW;
           return $this->renderImage($this->getVerifyCode(true));
       }
       return parent::run();
    }
}

答案 1 :(得分:1)

因为您已将YII_ENV设置为TEST,因此defined('YII_ENV') or define('YII_ENV', 'test');将其更改为defined('YII_ENV') or define('YII_ENV', 'prod');

答案 2 :(得分:1)

试试这个

<script>

window.onload = hello;

function hello()
{    
  document.getElementById('loginform-captcha-image').click();
}

</script>

答案 3 :(得分:0)

我发现了一种肮脏的方式 - 只需在页面加载时触发click事件。在表单结束后,在view文件的最后添加此代码;

$js = <<<JS
       $('#loginform-captcha-image').trigger('click');
JS;
$this->registerJs($js, $this::POS_READY);

它不是很漂亮,但它有效,而且这是我发现这个问题的唯一方法,这也困扰着我自己的网站。

答案 4 :(得分:0)

在您的控制器中,只需unset个验证码会话:

 session_start();
 unset($_SESSION["__captcha/panel/panel-auth/captcha"]);
 unset($_SESSION["__captcha/panel/panel-auth/captchacount"]);

答案 5 :(得分:0)

这对我有用

$(document).ready(function(){
  setTimeout(() => {
    $("#form-captcha-image").click();
  }, 100);  
});

答案 6 :(得分:-1)

将您的CaptchaAction更新为

public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
            'fixedVerifyCode' => null,
        ],
    ];
}

阅读Fixed Verify Code

如果设置为fixedVerifyCode,则验证码与fixedVerifyCode中设置的值相同

// code from yii\captcha\CaptchaAction in Yii2

public function getVerifyCode($regenerate = false)
{
    if ($this->fixedVerifyCode !== null) {
        return $this->fixedVerifyCode;
    }

    $session = Yii::$app->getSession();
    $session->open();
    $name = $this->getSessionKey();
    if ($session[$name] === null || $regenerate) {
        $session[$name] = $this->generateVerifyCode();
        $session[$name . 'count'] = 1;
    }

    return $session[$name];
}