Laravel/PHP 多表单提交(多次点击提交按钮)

Posted

技术标签:

【中文标题】Laravel/PHP 多表单提交(多次点击提交按钮)【英文标题】:Laravel/PHP multiple form submissions (multiple click on submit button) 【发布时间】:2018-03-23 16:43:22 【问题描述】:

由于提交了多个表单,我遇到了一些问题。 我使用 laravel 作为框架并创建一个浏览器游戏(我知道,有数百万)只是为了好玩。

我有一个带有“Construct”按钮的建筑物页面,该按钮采用表单(method =“post”)。

如果我按住 Enter 4-5 秒,将会触发许多请求,并且用户可以在数据库中创建许多记录。

我不想要像这样的唯一客户端修复

$(document).on('submit', 'form', function() 
    $(this).find('button:submit, input:submit').attr('disabled', 'disabled);
);

因为永远不要相信客户

这里有人有解决方案吗(也许用 laravel)?

提前致谢。

最好的问候。

【问题讨论】:

生成随机令牌。将令牌放入会话中。将令牌作为隐藏字段放入表单中。如果收到的令牌等于会话中的令牌,则在提交时执行数据库中的所有内容并从会话中删除令牌。 所以,我总是生成一个表单令牌并将其保存到会话中。而且每个表单都有一个包含此标记的隐藏输入字段,对吧? 将中间件用于路由组 (laravel.com/docs/5.6/routing#route-group-middleware) 您可以查看::share (laravel.com/docs/5.6/views#sharing-data-with-all-views) 随机令牌并保存在会话中。 【参考方案1】:

您可以使用 csrf 令牌在服务器端对其进行控制。您的表单将有一个用于防止跨站点请求伪造的令牌,您可以在控制器中访问此令牌以唯一标识客户端。当请求到达控制器时,您可以检查客户端是否第一次发送请求。如果不是第一次,您可以返回。 示例:-

public function construct(Request $request)
     $token = $request->_token;
     //check weather the token already exists or not, using db or session
     if(exists)
         return;
     

【讨论】:

有问题。 CSRF-Token 将为每个会话而不是每个请求创建。只有当我在会话中生成一个随机令牌并将发布请求作为@assistbss 提到的隐藏输入发送时,您的示例才有可能。或者你有另一种方法,也许是 Laravel 特有的?谢谢。【参考方案2】:

“生成一个随机令牌。将令牌放入会话中。将令牌作为隐藏字段放入表单中。如果收到的令牌等于会话中的令牌,则在提交时执行数据库中的所有内容并从会话中删除令牌。”

“使用路由组中间件 (laravel.com/docs/5.6/routing#route-group-middleware) 你可以查看::share (laravel.com/docs/5.6/views#sharing-data-with-all -views) 一个随机令牌并保存在会话中。"

感谢@assistbss

【讨论】:

以上是关于Laravel/PHP 多表单提交(多次点击提交按钮)的主要内容,如果未能解决你的问题,请参考以下文章

防止表单重复提交

Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据

Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据

多次动态添加(append)一个表单到一个模态框以后,如何解决多次提交?

防止表单重复的常用几种方式

使用Struts 2防止表单重复提交