开发者社区> 问答> 正文

请问防止表单重复提交是怎么做的?

关于防止表单重复提交的做法有很多,本人知道的有如下,只是简单讲讲,大家觉得什么办法最简单又有效?

1.有redis的环境
把提交的动作action,参数之类的作为redis的key,存进redis,设置一个很短的缓存时间,提交的时候判断如果存在这个key,说明是重复提交数据。

2.jquery前端判断
除了在程序端判断重复提交外,在页面前端也加一层措施,如点击提交按钮,按钮状态不可用(有的按钮用的a标签),如果不是按钮button,可以用jquery在提交的时候设置一个属性值,如果有了这个属性值,表示已经提交。

$("body").data("applycancel","unlock");

3.表单隐藏域token

生成一个随机数,放进session,给表单加一个隐藏域放进token,提交的时候判断表单的token隐藏域和session的值是否一致,如果不一致表示重复提交,处理表单的时候unset掉这个session。

展开
收起
爵霸 2016-03-09 11:13:08 2579 0
1 条回答
写回答
取消 提交回答
  • 用Etag在并发控制中实现乐观锁机制,下面例子不仅局限于重复提交:

    在并发场景中,多个客户端同时操作同一个资源,会出现一种情况:有客户端操作的资源在未知情况被发生了变更。

    举个简单的例子:

    用户A发了一个帖子,内容为post-a,用户B看到了post-a之后在下面写评论,在B写评论期间用户A把帖子内容改成了post-aa。会产生的一个问题是,用户B针对post-a 写的评论看起来怪怪的^_^

    解决办法很简单,在B看到A的时候就给他一个帖子资源标识tag-1,B提交评论时连同这个标识tag-1一同提交。服务器在接受请求之前验证先验条件,如果当时帖子内容无任何变化,仍然是tag-1,成功。

    如果帖子内容变化,新标识为tag-2,与B提交的tag-1不符合,表示期间资源发生了变化,返回412 Precondition Failed。然后刷新页面也好,提示也好,让B知道这一变化继续评论。

    API 情况也类似,只需要给返回资源都加上一个标识。

    2019-07-17 18:55:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载