您现在的位置是:首页 > 正文

如何解决Form表单的重复提交

2024-01-30 20:44:20阅读 0

以前在做居民信息管理系统时出现过一个非常严重的问题,在添加居民信息,每刷新一次就会数据库中就会重复提交一次。这个问题很让人头疼,正好最近有一次面试,也被提问到此问题了,故在网上搜了一些这方面的文章。供交流学习之用。

 

 

三种方案
javascript ,设置一个变量,只允许提交一次。 

<script language="javascript">


 var checkSubmitFlg = false;

 function checkSubmit() {

if (checkSubmitFlg == true) {


  return false;


  }


   checkSubmitFlg = true;


   return true;


   }


  document.ondblclick = function docondblclick() {

   window.event.returnValue = false;


   }


   document.onclick = function doconclick() {


   if (checkSubmitFlg) {


  window.event.returnValue = false;


  }

   }


  </script>


  


  <html:form action="myAction.do" method="post" οnsubmit="return checkSubmit();">  



2 还是javascript,将提交按钮或者image置为disable  


  <html:form action="myAction.do" method="post"

  οnsubmit="getElById('submitInput').disabled = true; return true;">   


  <html:image styleId="submitInput" src="images/ok_b.gif" border="0" /> 

   </html:form>  





3 利用struts的同步令牌机制  


 利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
  基本原理: 

  服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。 


 if (isTokenValid(request, true)) {


   // your code here


   return mapping.findForward("success");


  } else {


   saveToken(request);


   return mapping.findForward("submitagain");


  } 


  Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。  

  1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交


   2. 在action中:  


  //<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"


   // value="6aa35341f25184fd996c4c918255c3ae">


   if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,


   new ActionError("error.transaction.token"));

   resetToken(request); //删除session中的令牌  


  3. action有这样的一个方法生成令牌  

   protected String generateToken(HttpServletRequest request) {  
 

     HttpSession session = request.getSession();
 

      try {
 

  byte id[] = session.getId().getBytes();
 
    byte now[] =
 

   new Long(System.currentTimeMillis()).toString().getBytes();
 

    MessageDigest md = MessageDigest.getInstance("MD5");
 

   md.update(id);
 

    md.update(now);
 

    return (toHex(md.digest()));
 

    } catch (IllegalStateException e) {
 

    return (null);
 

    } catch (NoSuchAlgorithmException e) {
 

     return (null);
    }
     }
  在更新的时候防止按钮重复点击,主要是用Session来做判断

网站文章

  • 往c盘复制文件时,总是拒绝访问

    往c盘复制文件时,总是拒绝访问

    win10如何获取管理员权限?在往c盘复制文件时,总是拒绝访问,请问该怎么办?20 分享 举报 6个回答 #热议#3分钟看懂!2019年个税年度汇算怎么算? 华硕服务 百度认证:华硕电脑(上海)官方帐号推荐于2017-12-11 关注 Windows 10操作系统中开启Administrator超级管理员账户方法步骤如下百: 1、在Win10左下角的开始图标上点击...

    2024-01-30 20:44:12
  • 基本排序(二)插入排序(直接插入、Shell、折半)

      插入排序是常见的内部排序之一。常见的插入排序包括直接插入排序、Shell排序、折半排序。本篇主要介绍这三个排序。  转载请注明出处——http://www.cnblogs.com/zrtqsk/p/3807611.html,谢谢!一、直接插入排序  直接插入排序大概是我们最容易理解的一类排序了。  1、原理  对于n个元素的记录。  第一趟  :  把第2个元素拿...

    2024-01-30 20:44:05
  • 学计算机大连海事和徐州矿大,全国211院校考研难度详细分析!这些名校都是沧海遗珠!...

    学计算机大连海事和徐州矿大,全国211院校考研难度详细分析!这些名校都是沧海遗珠!...

    原标题:全国211院校考研难度详细分析!这些名校都是沧海遗珠!很多考研人,都是为了提升自己的学历而来!梦想着考取名校,圆自己一个名校梦。这些院校,往往竞争十分惨烈,让很多同学“望而生畏,感觉头大”!今...

    2024-01-30 20:43:35
  • centOS控制台字体太小解决方法

    centOS控制台,注意,不是图像界面的终端,其实无论控制台还是终端都可行。我用的是centos6.9,字体是一个我觉得很棒的terminus。解决正常分辨率下控制台字体太小的问题。 控制台字体不大是...

    2024-01-30 20:43:29
  • 求解线性子空间的交空间

    求解线性子空间的交空间

    求解线性子空间的交空间今天群友们讨论一个问题(应该是今年牛客多校的题目),Linear Algebra, Vector Space: how to find intersection of two subspaces ?故在此记录一下math.stackchange上网友的solution:[外链图片转存失败(img-cFbLg1Lu-1564241317468)(https://s2....

    2024-01-30 20:43:23
  • 来自别人的,关于C++ const 的全面总结

    来自别人的,关于C++ const 的全面总结

    来自于:http://blog.csdn.net/Eric_Jo/article/details/4138548

    2024-01-30 20:42:54
  • UE5火星系统素材

    UE5火星系统素材

    1.地形编辑 WorldCreator2.地形材质。

    2024-01-30 20:42:47
  • JSP中的EL表达式

    JSP中的EL表达式

    一、JSP EL语言定义        EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。 二、JSP EL简介1、语法结构     ${expr

    2024-01-30 20:42:40
  • 2022泰迪杯数据挖掘挑战赛C题方案及赛后总结:疫情背景下的周边游需求图谱分析

    2022泰迪杯数据挖掘挑战赛C题方案及赛后总结:疫情背景下的周边游需求图谱分析

    2022年第十届泰迪杯数据挖掘挑战赛C题『特等奖并获泰迪杯』方案及赛后总结:疫情背景下的周边游需求图谱分析

    2024-01-30 20:42:09
  • Spark学习:spark相似算子解析

    spark

    2024-01-30 20:42:02