表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:
- 点击提交按钮两次。
- 点击刷新按钮。
- 使用浏览器后退按钮重复之前的操作,导致重复提交表单。
- 使用浏览器历史记录重复提交表单。
- 浏览器重复的HTTP请求。
几种防止表单重复提交的方法
禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。
我之前的文章曾说过用一些Jquery插件效果不错。
Post/Redirect/Get模式。在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。
这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。
在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。
如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。
这使你的web应用有了更高级的XSRF保护。
在数据库里添加约束。在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。
你是如何克服数据重复提交问题的?你遇到过什么重复提交数据的现实例子吗?
[英文原文: Prevent Duplicate Form Submission ]
引用来自“justintung”的评论
引用来自“hanzhankang”的评论
干什么都放在session里,是不是太懒了
如果都丢到session,如果用户打开这页面,又不提交的话,那这个session不是删不掉而一直存在了?
引用来自“刘学炜”的评论
引用来自“Silentboy”的评论
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
呵呵
引用来自“Silentboy”的评论
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
呵呵
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
呵呵
引用来自“刘学炜”的评论
引用来自“刘学炜”的评论
呵呵
引用来自“刘学炜”的评论
呵呵
引用来自“铂金眼”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
如果是上面的流程,那么每生成一个新的就存储一个,怎么保证不被重复提交呢?
我表达能力不好!不说了!会越说越说不清……
如果你生成的token在提交后立刻被删除,那么不刷新的情况下是可以避免重复提交。
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
如果是上面的流程,那么每生成一个新的就存储一个,怎么保证不被重复提交呢?
我表达能力不好!不说了!会越说越说不清……
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
如果是上面的流程,那么每生成一个新的就存储一个,怎么保证不被重复提交呢?
我表达能力不好!不说了!会越说越说不清……
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
如果是上面的流程,那么每生成一个新的就存储一个,怎么保证不被重复提交呢?
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
个人感觉使用ajax方式比较简单方便,就像 osc 的 ajaxForm 。
引用来自“路人A”的评论
引用来自“justintung”的评论
引用来自“hanzhankang”的评论
干什么都放在session里,是不是太懒了
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“铂金眼”的评论
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“烽燧”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“爆炸”的评论
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“铂金眼”的评论
我是生成的token放在表单隐藏域,然后token存在数据库里面的,提交的时候取出来对比,没有匹配token就是非法提交,有匹配到就提交,然后删除这一台token。这样子OK不?
引用来自“hanzhankang”的评论
干什么都放在session里,是不是太懒了
引用来自“王振威”的评论
这都是常见的做法啊