插件窝 干货文章 ThinkPHP6表单重复提交处理:防止重复操作

ThinkPHP6表单重复提交处理:防止重复操作

表单 提交 Token 重复 207    来源:    2024-10-24

ThinkPHP6表单重复提交处理:防止重复操作

在Web应用程序开发中,表单提交是一项常见的操作。但是,有时用户会因为网络延迟或者误操作造成表单的重复提交,这样会给系统带来一些问题。为了解决这个问题,我们可以在ThinkPHP6框架中进行表单重复提交处理,以防止用户重复操作。

一、原因分析

造成表单重复提交的原因主要有两个:

立即学习“PHP免费学习笔记(深入)”;

1.网络延迟:当用户点击提交按钮后,表单数据发送到服务器进行处理。但是由于网络延迟的存在,服务器可能没有及时响应完成,而用户误以为操作失败,再次点击提交按钮。

2.误操作:用户在提交表单后,可能因为不确定操作是否成功而多次点击提交按钮,导致表单多次提交。

二、防止表单重复提交的方法

1.表单Token验证:通过在表单中添加一个Token来保证表单的唯一性。每次用户提交表单时,Token会生成一个唯一的值,并存储在Session中。服务器接收到表单数据后,会验证Token的有效性,如果验证失败,则表示表单重复提交。

代码示例:

在控制器中定义一个方法,用于生成Token:

namespace appcontroller;

use thinkController;

class Example extends Controller
{
    public function index()
    {
        // 生成Token
        $token = md5(uniqid(rand(), true));
        
        // 保存Token到Session
        session('token', $token);
        
        // 渲染模板,将Token传递给前端
        return $this->fetch('index', ['token' => $token]);
    }
}

在模板中添加Token隐藏域:

<form action="/example/submit" method="post">
    <input type="hidden" name="token" value="{{ $token }}">
    <!-- 其他表单元素 -->
    <button type="submit">提交</button>
</form>

在控制器中验证Token的有效性:

namespace appcontroller;

use thinkController;

class Example extends Controller
{
    public function submit()
    {
        // 获取表单提交的Token值
        $token = input('post.token');
        
        // 判断Token是否有效
        if ($token && $token === session('token')) {
            // 执行表单提交操作
            
            // 清除Session中的Token
            session('token', null);
            
            // 返回成功页面
            return '提交成功!';
        } else {
            // 返回错误页面
            return '非法的表单提交!';
        }
    }
}

通过以上代码,我们可以实现表单的Token验证,保证表单的唯一性。当用户点击提交按钮后,服务器会验证Token的有效性,如果验证失败,则表示表单重复提交,否则执行正常的表单提交操作。

2.禁用重复提交按钮:在用户点击提交按钮后,立即将按钮禁用,防止用户重复点击。

代码示例:

<script>
    document.getElementById('submitBtn').addEventListener('click', function () {
        // 禁用按钮
        this.disabled = true;
    });
</script>

通过以上代码,在用户点击提交按钮后,按钮会立即被禁用,用户无法重复点击,从而避免了表单的重复提交。

三、总结

表单重复提交是一个常见的问题,在Web应用程序开发中需要注意处理。以上介绍的方法是防止表单重复提交的常用方式,可以根据项目的实际情况选择适合的方式来实现表单重复提交的处理,保证系统的稳定性和安全性。