解决Yii2中刷新网页时验证码不刷新的问题 [ 2.0 版本 ]

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

在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代码的时候调用的,所以接下来的道理,相信大家都已经明白了。

完:)

解决Yii2中刷新网页时验证码不刷新的问题的更多相关文章

  1. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)

    现象:在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码.通讯内容或信用卡信息). 当点开"了解详情"后显示 ...

  2. 彻底解决Yii2中网页刷新时验证码不刷新的问题

    修改vendor/yiisoft/yii2/captcha/CaptchaValidator.php这个文件就可以了,修改的地方见下图: 总结 归根到底,是因为yii2在渲染网页的时候,会先输出js验 ...

  3. 解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题

    这两天开始在改OSChina的开源android客户端,打算用Fragment来分离Main这个Activity里的功能.用Fragment嵌套ViewPager+Fragment的时候发现问题. 红 ...

  4. 如何解决python中使用flask时遇到的markupsafe._compat包缺失的问题

    在使用python进行GUI的程序编写时,使用flask时出现错误: 在使用pip freeze进行查看已下载的包时显示MarkupSafe与Jinjia2都已安装: 在网上查阅一些资料后发现,在py ...

  5. 解决nodejs中json序列化时Date类型默认为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 上面只是一个例子,下面我用一个更具体化的例子来展示一个这个情况,我们在开发WEB项目中,经常用到Express组件, 我 ...

  6. 解决nodejs中json序列化时Date类型为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 zhupengfei@DESKTOP-HJASOE3 MINGW64 /d/MyProject/exp2 $ node ...

  7. 解决yii2中 Class yii/web/JsonParser does not exist, ReflectionException问题

    最近在调试RESTful API示例时,出现以下错误: { "name": "Exception", "message": "Cl ...

  8. 解决IIS中部署WCF时,访问.svc文件的404错误问题

    如果你直接在IIS 7中配置WCF,访问.svc文件时会出现404错误.解决方法,以管理员身份进入命令行模式,运行:"%windir%\Microsoft.NET\Framework\v3. ...

  9. vuex-along解决vuex中存储的数据在页面刷新之后失去的问题

    1. 为什么会失去? vuex可以看成是一个"提升变量"的一个工具,它是将state当做全局变量存储.F5刷新页面之后自然随着页面的刷新重新初始化state. 2. 如果解决数据保 ...

随机推荐

  1. Python RabbitMQ 权重设置

    消费端recv设置   注:设置消费端处理完一条消息后再发另一条   channel.basic_qos(prefetch_count=1)   由于每一条机器的处理速度不同,所以我们这里就会对应,机 ...

  2. centos7 install nginx+fastdfs

    说明:centos7单机部署 nginx fastdfs ## 创建一下目录作为存储数据图片的路径 可以自己定义 mkdir -pv /data/application/{storage,tracke ...

  3. java基础hashmap

    Iterator中hasNext(), next() 在Iterator类中,我们经常用到两个方法: hasNext(), next(),具体含义: next(),  是返回当前元素, 并指向下一个元 ...

  4. ERROR 1666 (HY000): Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.

    centos7.5 binlog恢复数据失败 问题: mysql> \. /tmp/inc.sql ERROR 1050 (42S01): Table 'new_1' already exist ...

  5. gulp的安装与使用【附配置代码】

    备忘 1.配置 下载安装node.js node -v //检查nodejs版本   npm(nodejs package manager)nodejs包管理工具   nodejs完毕在命令行输入np ...

  6. topcoder srm 560 div1

    problem1 link 从大到小贪心,较大的数字应该放置在较浅的位置. problem2 link 最后的位置要么都是整数(经过偶数次变换),要么是$(p.5, q.5)$这种位置(奇数次变换). ...

  7. java的一些基本概念——java11、jdk、jre、jvm等

    Java字节码 先介绍下c语言的编译过程,写好代码用编译器(比如gcc)编译过后是机器能够直接执行的二进制机器码. java也类似这种情况,但是java代码文件编译过后不是任何机器都能识别的机器码,而 ...

  8. 【科普】GSM伪基站 劫持 诈骗?用4G网就安全?想强制用4G?最详细的科普教程在此!

    最近在一些主流论坛(豆瓣.贴吧.虎扑.天涯)都出现了讨论GSM诈骗的新闻,很多受害者受骗. 1.什么是GSM劫持? 平时你的手机是连接到了运营商的基站,才能收到电话短信.伪基站就是有人也买了运营商的基 ...

  9. hdu 4277 USACO ORZ dfs+hash

    USACO ORZ Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  10. CTime格式化

    CTime Formateg://CString date = time.Format("%Y-%m-%d %H:%M:%S %W-%A");格式符号说明 %a —— 星期(缩写英 ...