FORM表单重复提交问题解决方法

时间:2022-06-23 13:08:36

    在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,还是返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改两次。

    导致表单重复提交的原因是:第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失。在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,顾会产生重复提交的效果。

    总结网上的解决办法和自己的测试,可以用以下几个办法解决:

(1)最简单:页面提交后转到另一个页面而不是本页面

(2)提交表单后提交按钮变灰/隐藏提交按钮

(3)在js里设置全局变量,提交后修改该变量的值,依据变量的值判断是否重复提交
             var flag=false;
             function checkForm(){
               if (flag==true){
                   return false;
               }
              flag=true;
              document.form1.submit();

             }

(4)在登录用户的Session中,放置一个随机数作为同步标记,并在初始化新增或编辑页面时就返回到前台页面中,用隐藏域赋值,当form被提交时,form中的同步标记就和Session中的同步标记作对比。在form首次提交的时候,这两个标记应该是一样的。如果标记不一样,那么该form就会禁止提交,一个错误就会返回给用户。在用户提交一个form时,如果按下浏览器中的后退按钮并尝试重新提交同一个form时,标记就会出现不匹配的现象。
       另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,Session中的标记值就会被修改为一个新的值,同时允许提交该form。

      还可以使用这个策略来控制对某些页面的直接访问,就好象上面资源保护中描述的一样。例如,假设一个用户将某个应用的页面A收藏到收藏夹中,而页面A 只允许通过页面B和C访问。当用户直接通过收藏夹来访问页面A,这时页面的访问顺序就是不正确的,这样同步标记将处在一个不同步的状态,或者它根本就不存在。不论怎样,访问都被禁止了。