防止表单重复提交

防止表单重复提交

什么是表单重复提交

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。

表单重复提交的的常见应用场景

场景一:在网络延迟的情况下让用户多次点击submit 按钮导致用户重复提交
场景二:表单提交后用户点击【刷新】按钮导致用户重复提交
场景三:用户提交表单后 ,点击浏览器的【后退】按钮回退到表单后再次提交

解决方案两种方式

利用JavaScript防止表表单重复提交
  • 定义一个表单是否已经提交的标识,默认值为false,第一次点击提交后就将标识改为true,只有标识为false才可以提交,为true则阻止表单提交。
  • 防止表单重复提交
    防止表单重复提交
    注意:需要在controller层让方法睡上一段时间,该时间内只能提交一次请求,时间过后跳转到新增成功页面
  • 也可以在第一次点击提交按钮后将提交按钮改为不可用状态,就不可以再次点击该按钮了。局限性:使用JavaScript防止表单重复提交的做法只对上述提交到导致表单重复提交的三种场景中的【场景一】有效,而对于【场景二】和【场景三】是没有用,依然无法解决表单重复提交问
    防止表单重复提交
利用session 防止表单重复提交

首先:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌 ),同时在当前用户的Session域中保护这个Token. 然后将Troken发送到客户端的form表单中,在form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器可以不处理重复提交的表单,如果相同则处理表单提交,处理完成后清除当前用户的Session域中存储的标识号。

Controller层打开jsp页面的方法
防止表单重复提交
前台jsp页面
防止表单重复提交
Controller层保存用户的方法
防止表单重复提交