【问题标题】:Laravel 4 - Preventing form from submitting multiple entriesLaravel 4 - 防止表单提交多个条目
【发布时间】:2014-10-12 13:23:57
【问题描述】:

我在提交带有 POST 请求的表单时遇到问题,如果我“垃圾邮件”(在页面重定向之前尽可能多次单击提交按钮)提交按钮,它会在我每次按下时创建一个请求按钮。为什么要这样做?是因为 CSRF 令牌没有重新生成吗?是不是因为我在本地主机上运行,​​我真的不知道到底发生了什么,我开始失去它了。

所以发生的情况是,每次点击表单上的提交按钮,它都会插入许多重复数据条目。

我在 Stack 上搜索并找到了另一个与我有同样问题的帖子。

Prevent creating multiple entries with Laravel 4

但答案并不能真正让我满意.. 必须有更好的方法来解决这个问题并应用于所有发布请求。

编辑 这是我的控制器的链接,其中包含 beforeFilter、我的资源控制器和视图。

【问题讨论】:

  • 请在您的问题中定义垃圾邮件。你可以参考laravel.com/docs/security
  • @PaulBastide 是的,这可能有点含糊,我现在继续编辑它.. 那里没有我的问题。

标签: php forms laravel submit


【解决方案1】:

CSRF 不会阻止发出请求。它只会阻止请求被处理。如果(在 chrome 中),您打开开发者工具并检查网络选项卡,则在进行重定向之前,只有第一个请求显示为黑色(其余为红色,表示错误。)

如果您想在页面重新加载之前禁用第一次之后的请求,您可以使用 jQuery 或 Javascript 禁用提交按钮。

$(document).ready(function(){

    $('#your-submit-button-id').click(function(){
        $('#your-submit-button-id').attr('disabled', true);
    });

});

【讨论】:

  • 是的,我明白了。但是,为什么即使被取消也能通过呢?我想认为被取消的东西会被否定。此外,如果可能的话,我宁愿不对 JS 做任何事情,因为它可以被关闭,然后这些东西无论如何都会通过.. 无论如何感谢您的回答!
  • 从客户端到服务器的每个请求都会得到某种响应。如果使用无效令牌(第二个、第三个等......请求)发布,默认情况下这是一个 302(重定向),它在到达您的路由之前被您的before 过滤器捕获。不幸的是,这需要服务器请求,并且在不实现某种客户端解决方案(通常意味着 jQuery 或 JavaScript)的情况下尽可能接近。你为什么关心额外的请求?这就是 CSRF 的目的。
  • 因为在我的情况下,其他请求正在我的数据库中创建一个新条目。例如,如果我去我的创建表单并输入一些东西,然后在下一页加载之前点击提交 6 次,那么它也会放置 6 个重复条目。
  • 啊,好的,那说明 CSRF 工作不正常。你能发布你的路线、CSRF 过滤器和表单的视图吗?
  • HHmmmm 在我看来一切正常,假设您在app/filters.php 中有默认的csrf 过滤器,并且access 过滤器没有做任何奇怪的事情。在您的控制器中设置过滤器应该可以工作,但我可能建议只使用一种通用路由方法,这样您就不必在每个控制器中都设置它。大多数人都希望在每个 POSTPUTDELETE 上使用 CSRF。在您的顶部routes.php....Route::when('*', 'csrf', array('post', 'put', 'delete'));
【解决方案2】:

CSFR (Cross Site Request Forgery) 不是用于验证请求的数量,而是用于验证 SESSION。清除浏览器中的 cookie 和缓存后,令牌应该会重新生成。

如果您想阻止提交多个请求,请禁用上面提到的提交按钮,或使用标志:https://jeykeu.wordpress.com/2012/03/09/jquery-prevent-multiple-ajax-requests/

【讨论】:

    【解决方案3】:

    看起来像添加以下函数:"this.disabled=true;this.value='Submiting...';this.form.submit();" 到按钮的 'onclick' 事件将处理它。

    <button type="submit" onclick="this.disabled=true;this.value='Submiting...';this.form.submit();" class="btn">Submiting...</button>
    

    【讨论】:

    • 什么是“这个”?您能否解释一下您的解决方案,以便其他人可以从中学习?
    • 你说得对,我的回答很模糊。我编辑过,但情况仍然模糊,请随意建议新版本。
    猜你喜欢
    • 2013-06-18
    • 2013-07-24
    • 1970-01-01
    • 2014-09-18
    • 2014-09-04
    • 2019-03-28
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多