表单 重复 发送 解决方案
用户提交的表单,有的时候会因为网络延迟重复提交内容
我遇到的是通过ajax方式提交,所以还停留在本页面,但是回馈没做好,总之用户没感知到,还会继续点击发送按钮,结果一下就出现了好多条
嗯,大概说说自己的想法,希望能得大家的指点:
前端:
前端的话,当表单提交,这时候按钮变成disable状态
后端:
生成一个token放在表单的隐藏字段里,服务器端保留,并等待带用户提交时对照令牌
我的问题是:
1.在真正的应用环境里,一般这种情况只做前端或者后端的处理是不是足够
2.如果要生成令牌的话,保存在哪里合适,session或者数据库里,当然session可能本身就在内存里不是文件
3.保存多少条合适,会不会有用户开来了无数的页面造成数据过量...可能是恶意用户
4.也许这也涉及到令牌保存多长时间,比如写一篇文章的时间和回复一篇文章的时间也不一样,是不是需要考虑
5.这里令牌的生成有没有特殊讲究
谢谢大家了啦~!
问题还算有一般性吧,不过我用的环境是php apache mysql
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
csrftoken是为了防止跨域提交用的,比如我在example.com上做了个指向你网站的ajax按钮,我的用户要是已经在你网站登陆了,发送的恶意post请求就要靠token来防,具体请见clickjacking
但token是不能防止恶意刷数据库的,我用python的xml模组就能轻松抓到你的token返还给你。一定得做captcha
我们知道每个用户在访问的时候session_id都不同,可以以这个session_id作为key,实现一个简单的锁机制。
例如,MySQL 的内存表,设置某个字段的索引为唯一的,用户提交表单就先写一条记录(锁),如果冲突则表示重复提交。提交后处理完成后,则删除这条记录。缺点是需要额外的一个守护进程,删除那些由于意外没有被删掉的锁,当然也可以加个时间戳字段,比如超过30秒就当做锁已经失效。
除了 MySQL 的内存表,redis 也适合实现这样的简单的锁机制,这可以通过 redis 的事务机制来实现的。