zoukankan      html  css  js  c++  java
  • 解决Yii2中刷新网页时验证码不刷新的问题

     ljfrocky  2015-05-30 19:39:00  1304次浏览  5条评论  10 11 0

    在Yii2框架中,如果在表单中使用了验证码,会发现一个奇怪的小问题,就是刷新网页时验证码图片不会跟着刷新。


    网上的解决方法

    网上的大多数解决方法都是通过修改vendor/yiisoft/yii2/captcha/CaptchaAction.php中的代码来解决,以下两种方法可以任选其一:

    1.修改getVerifyCode()方法的参数默认值
    修改参数默认值
    将参数$regenerate的默认值由false改为true,这样在不传参数的情况下,程序每次获取验证码时都会重新生成。

    2.修改run()方法
    传递参数
    在红色箭头指向的地方中,添加一个参数true,同样可以解决问题。


    带来的问题

    使用上面两种方法确实都可以解决验证码不刷新的问题,但这样会带来一个新的问题,就是在开启表单客户端验证(enableClientValidation)的情况下,即使用户输入了正确的验证码,网页仍然会提示“验证码错误”:
    验证码错误

    那肿么办呢?在这里我们可以选择关闭表单的客户端验证功能,以此来解决这个问题:
    关闭客户端验证
    但这种解决方法不是很完美,因为关闭了客户端的验证功能后,表单数据就只能提交到后台后再验证了,这样无疑会增加服务器的压力。


    完美解决方法

    上面说了那么多,解决方法貌似都不是很完美,其实要完美解决验证码不刷新的问题十分简单,我们不需要修改CaptchaAction.php,只要修改vendor/yiisoft/yii2/captcha/CaptchaValidator.php这个文件就可以了,修改的地方见下图:
    完美解决方法
    在红色箭头指向的地方,将参数false改为true即可完美解决问题。


    总结

    归根到底,是因为yii2在渲染Captcha小部件的时候,会先输出js验证代码,然后再渲染验证码图片,也就是说,验证码字符串必须在输出js代码前就要重新生成,而CaptchaAction.php中的run()方法是渲染验证码图片的时候调用的,CaptchaValidator.php中的clientValidateAttribute()是输出js代码的时候调用的,所以接下来的道理,相信大家都已经明白了。

    完:)







  • 相关阅读:
    移动端布局方案汇总&&原理解析
    Javascript运行机制
    git 使用
    async await详解
    vue使用axios调用豆瓣API跨域问题
    hash和history的区别
    http状态码
    XSS 和 CSRF简述及预防措施
    【pytorch】pytorch基础学习
    [源码解读] ResNet源码解读(pytorch)
  • 原文地址:https://www.cnblogs.com/sheapchen/p/4d9fc74108d0caf050859562924ad903.html
Copyright © 2011-2022 走看看