有使用JavaScript禁用提交按钮、使用Post/Redirect/Get模式、在session中存放一个特殊标志、使用header函数转向、表单过期的处理、判断表单动作的技巧、使用Token(令牌)等多种方法可以防止表单重复提交。
使用JavaScript禁用提交按钮
- 在表单提交后,使用JavaScript使提交按钮disable。
- 这种方法可以防止用户因网络速度慢或页面未及时响应而多次点击按钮。
使用Post/Redirect/Get模式
- 在提交后执行页面重定向,这就是所谓的Post/Redirect/Get模式。
- 当用户提交了表单后,服务器端执行一个客户端的重定向,转到提交成功信息页面。
在session中存放一个特殊标志
- 在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中。
- 用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。
使用header函数转向
- 当用户提交表单,服务器端处理后立即转向其他的页面。
- 这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。
表单过期的处理
- 使用header头设置缓存控制头Cache-control。
- 这样可以防止用户填写表单的时候,单击提交按钮返回时,刚刚在表单上填写的内容不会被清除。
判断表单动作的技巧
- 表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑。
- 只要通过提交按钮的name就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮。
使用Token(令牌)
- 在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。
- 然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
以上方法可以根据实际情况单独使用或组合使用,以达到最佳的防重复提交效果