首页 > 表单 重复 发送 解决方案

表单 重复 发送 解决方案

用户提交的表单,有的时候会因为网络延迟重复提交内容

我遇到的是通过ajax方式提交,所以还停留在本页面,但是回馈没做好,总之用户没感知到,还会继续点击发送按钮,结果一下就出现了好多条

嗯,大概说说自己的想法,希望能得大家的指点:

前端:

前端的话,当表单提交,这时候按钮变成disable状态

后端:

生成一个token放在表单的隐藏字段里,服务器端保留,并等待带用户提交时对照令牌

我的问题是:

1.在真正的应用环境里,一般这种情况只做前端或者后端的处理是不是足够

2.如果要生成令牌的话,保存在哪里合适,session或者数据库里,当然session可能本身就在内存里不是文件

3.保存多少条合适,会不会有用户开来了无数的页面造成数据过量...可能是恶意用户

4.也许这也涉及到令牌保存多长时间,比如写一篇文章的时间和回复一篇文章的时间也不一样,是不是需要考虑

5.这里令牌的生成有没有特殊讲究

谢谢大家了啦~!

问题还算有一般性吧,不过我用的环境是php apache mysql


csrftoken是为了防止跨域提交用的,比如我在example.com上做了个指向你网站的ajax按钮,我的用户要是已经在你网站登陆了,发送的恶意post请求就要靠token来防,具体请见clickjacking

但token是不能防止恶意刷数据库的,我用python的xml模组就能轻松抓到你的token返还给你。一定得做captcha


我们知道每个用户在访问的时候session_id都不同,可以以这个session_id作为key,实现一个简单的锁机制。

例如,MySQL 的内存表,设置某个字段的索引为唯一的,用户提交表单就先写一条记录(锁),如果冲突则表示重复提交。提交后处理完成后,则删除这条记录。缺点是需要额外的一个守护进程,删除那些由于意外没有被删掉的锁,当然也可以加个时间戳字段,比如超过30秒就当做锁已经失效。

除了 MySQL 的内存表,redis 也适合实现这样的简单的锁机制,这可以通过 redis 的事务机制来实现的。

【热门文章】
【热门文章】