我有 3 个控制器,分别命名为站点、广告和消息。所有控制器都有验证码动作类定义,并且它们在每个控制器的访问规则中都被允许。
验证码在站点控制器中运行良好,但在其他控制器中其验证不起作用。它显示验证码图像和重新验证码也可以工作,但只是验证不起作用,有什么想法可以调试吗?
更新 :
我调查了 Yii 并发现了一些东西。CCaptcha 小部件使用控制器名称作为会话密钥的一部分来存储验证码。
CCaptchaAction.php
protected function getSessionKey(){
return self::SESSION_VAR_PREFIX . Yii::app()->getId() . '.' . $this->getController()->getUniqueId() . '.' . $this->getId();
}
如您所见,$this->getController()->getUniqueId()是session key 的一部分。
CCaptchaAction 使用此函数生成和验证验证码。
问题是生成和验证发生在不同的控制器中。
在一个清晰的示例中,假设我们有控制器A和B。
当在控制器A中生成验证码时, print_r($_SESSION) 类似于:
数组 ( [Yii.CCaptchaAction.12bd9136. A .captcha] => eyntri [Yii.CCaptchaAction.12bd9136. A .captchacount] => 1
并且当控制器B中发生验证码验证时,验证方法会检查是否
New 在控制器 B 中生成并显示代码=== $_SESSION[Yii.CCaptchaAction.12bd9136. .captcha ] 是真是假。
当生成器和验证器控制器不相同时,它们并不总是相等的!