世界超算排行榜:太湖之光!

IT教程学习网

网站建设

thinkphp5验证码验证不成功解决方法

文章来源:未知   作者:inalls   浏览量:
  笔者使用TP5的验证码功能是按照官方的手册进行原样验证,但是就是显示验证失败,于是百度查询了两天,挨个尝试也没有解决。于是打算自己动手,于把与验证码相关的类文件通览一遍,逐步来定位thinkphp5验证码问题的出处,一般说来与验证码相关的类库文件有:thinkphp5扩展的验证码类库-Captcha.php,和内置类库Session.php。
  深腾网编辑使用tp5验证码和解决验证不成功的过程如下:

Tp5验证码验证步骤一:模板输出图片验证码

模版内验证码的显示
<div>{:captcha_img()}</div>
或者
<div><img src="{:captcha_src()}" alt="captcha" /></div>
  注意:上面两种的最终效果是一样的,根据需要调用即可(在使用时需求开启URL路由)。如果按照上面官方手册的方法输出验证会出现tp5验证码不显示的情况,请参考其他文章解决,这里主要解决tp5验证码验证的问题。

Tp5验证码验证步骤二:使用 Composer 安装 think-captcha 扩展包

首先使用 Composer 安装 think-captcha 扩展包:
composer require topthink/think-captcha;(这里只针对thinkphp5核心版本,完整版已经完成安装不需要再进行这一操作步骤)。
强烈建议使用 Composer 安装和更新扩展类库, ThinkPHP5.0的扩展类库都采用 Composer 方式进行安装。

Tp5验证码验证步骤三:调用Captcha类进行验证码验证

使用 Composer 安装 think-captcha 扩展包后调用非常方便,只需求在使用Captcha类控制器使用命令空间就可以:use think\captcha;
调用Captcha类进行验证码验证只需求对类实例化后调用验证函数即可:$capt=new captcha\Captcha();
$result=$capt->check($_POST['verify']);
if(!$result)
{
echo 'check code missing';
}
else
{
echo 'check code success';
}
使用Composer 安装的扩展类库调用的详细方法解决请参见本站另一篇文章:thinkphp5如何引入加载第三方类库

Tp5验证码验证步骤四:验证码验证不成功的现象

到这里我们就已经完成了thinkphp5的整个验证码验证过程,当我们提交表单是会出现验证码不成功的提示。下面按照以下过程来教大家寻找问题定位。一般经验较高的PHP程序员可以直接看解决方法。
验证不成功我们首先想到的是当然session中是否存在验证码,可以在表单处理脚本的控制器中调用如下代码:
Session::start();
var_dump($_SESSION);
exit;
  结果显示为空。我们可能会想到在验证码生成后保存验证码到SESSION时是否生成了验证码呢?抱着这个问题,我查找Captcha类的验证码生成函数public function entry($id = ''),在这个函数中可以找到生成验证码并将验证码保存到session中的代码如下:
// 保存验证码
        $key                   = $this->authcode($this->seKey);
        $code                  = $this->authcode(strtoupper(implode('', $code)));
        $secode                = [];
        $secode['verify_code'] = $code; // 把校验码保存到session
        $secode['verify_time'] = time(); // 验证码创建时间
        Session::set($key . $id, $secode, '');
为了弄清楚这里是否生成了验证码并保存到session,我们在这段代码后面打印session:
Var_dump($_SESSION);
Exit;
同时要在控制器输出模板的操作中作下修改:(这一步要在打印session之前完成)
//return $this->fetch('register');
$code=new captcha\Captcha();
return $code->entry();
执行后发现果然输入了验证码保存在session的操作。
  通过上述现象可以得出tp5验证生成后保存到session正常,只是在另一函数中验证session中的验证码是出了问题。我们看一下session文件,发现同时生成了两个session文件,到这里我们已经知道原因了,说明是通过两个域名访问才会生成两个session文件,而另一个session文件是空的(这是在验证码验证时开启session生成的)。

Tp5验证码验证步骤五:验证码验证不成功的解决方法

  既然我们已经知道验证码验证不成功的原因原理,我们就可针对性的提出解决方法。原因主出在跨域上,为什么呢?一般来说http://www.inalls.com和inalls.com是两个域名,如果单访问某一个域名是没有问题的,当然在访问中突然由不带www的域名跳转到带www的域名时就会生成新的session文件,此时tp5的验证码就会出问题(这多常见于一些自动给域名加上www的浏览器,如火狐等一些浏览器。
  我们可以采用如下方法解决:统一采用不带www的域名或带www的域名进行访问,将不带www的URL重定向到带www的域名(这当然是针对较小站点),如果是针对集群的话就应该采用session跨域共离的方法来解决。当然网上也有很多方法例如:修改php或thinkphp5中的配置项例如:'httponly'  => 0和’use_trans_sid’=>true。这两个配置项确实能解决跨域的问题,但将cookei放在URL进行传递,将是非常不安全,因此并未采用。

分享到:

  • Copyright © 2014-2026 深腾网 版权所有:静岳互联网咨询工作室
  • 冀ICP备16020878-1