ThinkPHP实现验证码验证:Form表单与AJAX两种方法详解

木白
木白
发布时间:2026-10-13| 5人浏览过
原创

本文将详细介绍如何在ThinkPHP框架中实现验证码验证功能,涵盖基于Form表单提交的同步验证和使用jQuery AJAX的异步验证两种典型场景。

准备条件

在开始之前,确保你的项目已经正确安装了ThinkPHP框架,并且基础的路由和控制器配置正常运行。我们将创建一个名为 VerifyController 的控制器来处理验证码的生成与校验逻辑,以及对应的视图文件用于展示输入界面。

第一种方案:Form表单同步验证

这种方式适用于传统的页面刷新验证流程。用户输入验证码后点击提交按钮,页面跳转至处理接口,成功或失败后显示相应提示。

第1步:编写控制器 VerifyController.class.php

目的:定义验证码生成方法 verify 和校验方法 checkLogin。

  • 入口:在 Home/Controller/ 目录下创建 VerifyController.class.php。
  • 动作:
namespace Home\Controller;
use Think\Controller;

class VerifyController extends Controller {
    public function index() {
        $this->display();
    }

    public function checkLogin() {
        // 实例化验证码类
        $verify = new \Think\Verify();
        // 获取表单提交的验证码字段
        $code = I('post.verify');
        
        if ($verify->check($code)) {
            $this->success('验证码正确');
        } else {
            $this->error('验证码错误');
        }
    }

    public function verify() {
        // 实例化Verify对象
        $verify = new \Think\Verify();
        // 配置验证码参数
        $verify->fontSize = 14;      // 字体大小
        $verify->length = 4;         // 位数
        $verify->imageH = 34;        // 高度
        $verify->useImgBg = true;    // 背景图片
        $verify->useNoise = false;   // 关闭杂点干扰
        $verify->entry();            // 输出验证码
    }
}

第2步:编写视图层 Verify/index.html

目的:构建包含验证码图片显示和表单提交功能的HTML页面。

  • 入口:对应控制器的 index 方法渲染的模板。
  • 动作:
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <form action="{:U('verify/checkLogin')}" method="post">
        <div class="form-group has-feedback">
            <input type="text" name="verify" id="verify" placeholder="验证码" style="width:100px;" />
            <!-- 点击图片可刷新验证码 -->
            <img class="verify" src="{:U('verify')}" alt="验证码" onClick="this.src=this.src+'?'+Math.random()" />
        </div>
        <div class="col-xs-4">
            <button type="submit">验证</button>
        </div>
    </form>
</body>
</html>

第二种方案:AJAX异步验证

这种方式适用于无刷新体验。前端收集用户输入,通过Ajax请求发送到服务器,根据服务器返回的状态码(1或0)在前端弹出提示。

第1步:修改控制器 VerifyController.class.php

目的:调整校验方法以返回JSON数据供前端解析。

  • 动作:将 I('post.verify') 改为 $_POST['code'] 以匹配Ajax发送的数据结构,并使用 ajaxReturn 返回结果。
public function checkLogin() {
    $verify = new \Think\Verify();
    $code = $_POST['code']; // 注意此处接收参数名为 'code'
    if ($verify->check($code)) {
        $this->ajaxReturn(1); // 成功返回1
    } else {
        $this->ajaxReturn(0); // 失败返回0
    }
}
// verify() 方法保持不变

第2步:修改视图层 Verify/index.html

目的:引入jQuery库,添加JavaScript事件监听点击行为并发起Ajax请求。

  • 重要参数:需要确保项目中存在 jquery-2.1.0.min.js 文件,或在配置文件中进行路径映射。
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="__JS__/jquery-2.1.0.min.js"></script>
</head>
<body>
    <form action="{:U('verify/checkLogin')}" method="post">
        <div class="form-group has-feedback">
            <input type="text" name="verify" id="verify" placeholder="验证码" style="width:100px;" />
            <img class="verify" src="{:U('verify')}" alt="验证码" onClick="this.src=this.src+'?'+Math.random()" />
        </div>
        <div class="col-xs-4">
            <!-- 修改为 button type="button" 防止默认提交 -->
            <button type="button" id="ver">验证</button>
        </div>
    </form>
    <script>
        $(document).ready(function(){
            $("#ver").click(function(){
                var code = $("#verify").val(); // 获取输入值
                var url = $('form').attr('action'); // 获取表单action地址
                $.ajax({
                    type:"post",
                    url: url,
                    data: {"code": code}, // 发送参数名为 'code'
                    error: function(request){
                        alert("ajax请求出错");
                    },
                    success: function(data){
                        if(data == 1) {
                            alert("验证码正确");
                        } else {
                            alert("验证码错误");
                        }
                    }
                });
            });
        });
    </script>
</body>
</html>

第3步:配置静态资源路径 (可选)

如果在视图中使用了 __JS__ 这样的占位符,需要在 Common/conf/config.php 中配置路径映射,以确保jQuery等静态文件能正确加载。

return array(
    /* 地址替换 */
    'TMPL_PARSE_STRING' => array(
        '__JS__' => __ROOT__.'/Public/JS',
    ),
);

完成判断

完成上述配置后,访问对应的Index页面即可看到验证码。尝试输入正确/错误的字符并点击验证,观察是页面跳转提示还是弹窗提示,以此确认验证逻辑是否符合预期。

原文有依据的排错

如果点击AJAX验证按钮没有任何反应:
1. 检查浏览器控制台是否有报错,确认 jquery-2.1.0.min.js 是否成功加载。
2. 确认控制器中 checkLogin 接收的参数名是否与Ajax发送的 data 键名一致(文中示例均为 code)。

以上就是ThinkPHP验证码的实现(form、ajax实现验证)的详细内容,更多关于ThinkPHP验证码开发的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。