什么是防止双重表单提交的最佳做法

时间:2015-05-14 02:04:57

标签: java javascript jquery ajax forms

最近我正在开发一个使用ajax来调用java servlet的项目,并且请求需要10秒以上来获取响应,所以我需要确保在此期间用户将无法提交表单再次,我当前的方法是检测提交按钮单击事件并禁用提交按钮,一旦在ajax中触发成功或错误功能,再次启用该按钮,但这不是一个好方法。

----编辑---- 对不起,我没有解释清楚,我的意思是这可以阻止非技术背景的用户,但如果有人打算攻击网站或任何原因, 他们可以简单地修改html代码来启用按钮,然后再做一次提交,

在我尝试另一种在表单提交后设置cookie间隔的方法之前,在请求完成时检查cookie,但只是想知道是否还有其他方法可以做到这一点,这个问题纯粹是出于学习目的。

对不起我的英文:)

2 个答案:

答案 0 :(得分:2)

我没有看到禁用按钮的任何问题,这是我经常使用的,因为这不仅表明系统确认了您的点击,而且还阻止用户再次点击。

如果由于某种原因你不喜欢它,你可以禁用这样的基础方法调用:

var isSubmitting = false;

function handleClick(){
    if (!isSubmitting)
    {
        isSubmitting = true;
        $.ajax(
            "http://yourservice/submit" {
                data: {someData:123},
                contentType: 'application/json',
                type: 'POST',
                success: function(){
                    isSubmitting = false;
                },

            });

    }
}

关于你的编辑,cookie听起来是一个很好的方法,基本上你需要服务器将要传递给客户端的东西,然后检查提交。一旦获得授权,服务器将阻止使用相同参数处理其他请求。

但请记住,恶意用户会产生数千个获取cookie的请求,然后执行所有提交,因此它不能真正抵御攻击者,因为你必须实现某种形式的{{3 }}

所以最后如果你只想防止意外提交,按钮隐藏就足够了。

答案 1 :(得分:0)

我已经完成并且已经成功的是你所描述的内容和阻止按钮调用的函数执行两次的组合。我通过保持一个变量在第一个请求中设置为true来执行此操作,然后在后续请求中检查它,如果它是真的,我什么都不做。像这样:

var isRequestAlive = false;

var submit = function(){
    if(!isRequestAlive){
        isRequestAlive = true;
        doAjaxStuff("", function(){
            isRequestAlive = false;
        })
    }
}