`

如何防止用户重复提交

阅读更多
防止重复提交java解决

  B/S结构的软件开发中,特别是在越大型的分布式应用中体现的越明显,后端的处理往往会因为出现较多的时间消耗而引起延迟,这种延迟有可能过长而最终使用户认为是自己的操作错误,导致他们重新提交请求,由于任务的重复提交,服务器资源大部分被占用,情节严重可能出现类似死机现象。

  预期达到目标:

  1、当用户进行的是Refresh/Reload/Back/Forward操作、以及先Back再Submit操作时,仅仅是reloading先前的结果页。

  2、当用户重复提交同一个任务操作时,后台服务接收并处理第一次提交的任务,后面提交不起作用(不转向也不提示)。

  3、该功能具有公用性。

  基本形成思路:

  1、在basic filter中实现公用性

  if(true){//问题1:如何确定是否为重复提交

  。..

  chain.doFilter(request,response);

  }else{

  //问题2:如何实现不转向、不提示也不显示空白页

  }

  2、网上资料概括

  a、提交表单后按钮变灰/隐藏提交按钮

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

}

 c、struts (webwork没有找到这个资料)
//验证事务控制令牌,会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
  //在action中:
  if (!isTokenValid(request))
  errors.add(ActionErrors.GLOBAL_ERROR,
  new ActionError(“error.transaction.token”));
  resetToken(request); //删除session中的令牌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);
  }
  }

d、用户使用浏览器时,可以经常使用向后的按钮,因此就有可能重复提交一个他们已经提交过的form,这样就会带来一个重复事务处理的问题。同样,一个用户也可能在接收到一个确认的页面之前按下停止的按钮,接着再次提交同一个form。对于这些情况,我们都想跟踪并且禁止这些重复的提交,我们可以使用一个控制servlet来提供一个控制点,以解决这个问题。

  同步记号(Synchronizer (or Dvu) Token)

  这个策略是为了解决重复的form提交问题。一个同步的记号被设置在一个用户的Session中,并且包含在返回到客户的每一个form中。当 form被提交时,form中的同步标记就和Session中的同步标记作对比。在form首次提交的时候,这两个标记应该是一样的。如果标记不一样,那么该form就会禁止提交,一个错误就会返回给用户。在用户提交一个form时,如果按下浏览器中的后退按钮并尝试重新提交同一个form时,标记就会出现不匹配的现象。

  另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,

  另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,Session中的标记值就会被修改为一个新的值,同时允许提交该form。

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

  e、做一个hidden框,名字自己定,提交后得到这个值放入session,提交前判断session是否为空

  解决方案:

  1、后台公共类中实现前台的Form中自动生成两个hidden文本功能,一个是作page是否重复提交判断,并由系统自动附上关键值(如 struts采用的方案);另一个作为button是否重复提交判断(struts中好像没有)。由后台公共类实现界面两个hidden text自动生成的好处在于公用性。

  2、在basic filter中根据两个hidden text值判断是否为重复提交。

  3、javascript中作一个公共方法,实现功能:如果需要判断是否重复提交,就给第二个hidden text附上关键值,并使该功能不可用。
分享到:
评论

相关推荐

    防止用户重复提交表单的方法和组件.rar

    好友使用vue技术封装了一个专门用于提交表单和下载文件的“防抖按钮”,其实现原理和使用方法看这里 https://blog.csdn.net/PursueExcellence/article/details/103903139。

    修改禁止多次重复提交

    如何修改禁止多次重复提交

    ajax 防止按钮重复提交

    防止用户误操作,重复提交

    Struts2防止表单重复提交

    当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。...

    java实现防止表单重复提交

    服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...

    前端防止用户重复提交js实现代码示例

    主要给大家介绍了关于前端防止用户重复提交js实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧

    防止用户刷新,重复提交数据

    源码,下载下来直接可以用(防止用户刷新,重复提交数据) 有十分清晰的操作步骤,和注释,代码也封装的很好,我经常用

    注册或者点击按钮时,怎么防止用户重复提交数据(实例讲解)

    主要是对注册或者点击按钮时,怎么防止用户重复提交数据进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    防止用户表单重复提交处理

    防止用户表单重复提交的完整demo 分别在js与后台中处理,js处理(针对网络慢情况) 后台处理(针对用户点击浏览器上的刷新按钮等)

    php防止用户重复提交表单

    主要介绍了解决php表单重复提交实现方法,需要的朋友可以参考下

    防止重复提交

    C#中防止重复提交方法,当用户单击按钮以后,该按钮变灰,不能再次单击,直到重新加载页面或者跳转

    几种防止表单重复提交的方法

    表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用...

    Java怎样防止重复提交

    防止重复提交java解决  B/S结构的软件开发中,特别是在越大型的分布式应用中体现的越明显,后端...  2、当用户重复提交同一个任务操作时,后台服务接收并处理第一次提交的任务,后面提交不起作用(不转向也不提示)。

    Asp.net防重复提交机制实现方法

    为Button或其他控件加上下面两个属性即可1.UseSubmitBehavior=”false”使用服务器端提交机制,即执行OnClick事件。 2.OnClientClick客户端点击按钮后,设置控件为不可用,控件文本显示处理中…,待服务器端执行完...

    php防止form重复提交的方法

    防止用户在提交表单后,刷新后出现再次提交的结果

    php+Ajax远程加载防止重复提交

    php+Ajax远程加载防止重复提交,登录表单loading效果,一个提高用户体验,二个防止避免重复提交表单,ajax判断加载是否完成。

    myMvcWeb.rar Java MVC

    刚刚学完了MVC,根据自己的感悟和理解写了一个小项目。 完全按照MVC模式,后面有一个MVC的...搭建初步的项目框架、其他功能:防止用户重复提交、注册和登录时使用验证码。 ------------------------------------------

    防止用户将表单重复提交的方法汇总

    表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用...

Global site tag (gtag.js) - Google Analytics