Java web解决表单重复提交问题

发表于:2015-5-21 10:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yfsmooth    来源:51Testing软件测试网采编

  我们大家再进行web开发的时候,必不可少会遇见表单重复提交问题。今天就来给总结如何解决表单提交问题,欢迎大家交流指正。
  首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提交?2.什么情况下会出现表单重复提交?3.什么情况需要避免表单重复提交?
  什么叫表单提交问题,说白了,就是同一份信息,重复的提交给服务器。
  那么,在什么情况下回产生表单重复提交的情况呢?
  给大家列举以下情况:
  1.点击F5刷新页面:当用户点击submit将已经写好的表单数据提交到服务器时,可以在浏览器的url看到地址和参数的变化,但因为网速等问题,用户当前页面并未刷新,或者点击刷新页面,造成表单重复提交。
  2.重复点击提交按钮:因为网络问题,未能及时跳转显示内同,部分用户可能会出于心急重复提交提交按钮,造成多次提交内容到服务器。
  3.前进后退操作:有些用户在进行某些工作操作时,可能出于需要或者某种情况,进行后退操作,浏览刚才填入的信息,在进行后退和前进的操作可能也会造成表单数据重复提交到服务器。
  4.使用浏览器历史记录重复访问:某些用户可能会出于好奇,利用浏览器的历史记录功能重复访问提交页面,同样会造成表单重复提交问题。
  其实我们在进行web开发的时候,遇到的所有问题不一定是都需要解决的,大多数问题需要分情况而定。
  例如现在所说的表单重复提交问题
  那什么情况下必须防止表单重复提交问题呢:例如说注册用户功能(向数据库中写入垃圾信息),投票功能(多次刷票),购物结算功能(多次扣钱),防止论坛灌水功能。。。。
  明确了以上三个问题后,我们来讨论如何解决表单重复提交问题:
  翻阅了众多博客发现表单重复问题可以有多种解决方案,总结如下:
  1.js方法解决:关于js方法解决就是说通过js动态控制提交按钮不能多次点击,或者多次点击不起作用。
  方案一:通过设立标识使表单不能重复提交:
  var flag=true;
  function Sub(){
  if(flag){
  flag = false;
  document.form1.onsubmit();
  }
  }
  方案二:一次点击后使得提交按钮变成不可用
  <input type="button" value="login" onclick="this.disabled=true;this.form.submit();" />
  总的来说,js解决方案是基本可以防止重复点击提交按钮造成的重复提交问题,但是前进后退操作,或者F5刷新页面等问题并不能得到解决。
  最重要的一点,前端的代码只能防止不懂js的用户,如果碰到懂得js的编程人员,那js方法就没用了。
  2.设置HTTP报头,控制表单缓存,使得所控制的表单不缓存信息,这样用户就无法通过重复点击按钮去重复提交表单。
  <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
  但是这样做也有局限性,用户在提交页面点击刷新也会造成表单的重复提交。
  3.通过PRG设计模式(用来防止F5刷新重复提交表单):
  PRG模式通过响应页面Header返回HTTP状态码进行页面跳转替代响应页面跳转过程。具体过程如下:
  客户端用POST方法请求服务器端数据变更,服务器对客户端发来的请求进行处理重定向到另一个结果页面上,客户端所有对页面的显示请求都用get方法告知服务器端,这样做,后退再前进或刷新的行为都发出的是get请求,不会对server产生任何数据更改的影响。
  但此方法也不能防止所有情况:例如用户多次点击提交按钮;恶意用户避开客户端预防多次提交手段,进行重复提交请求;
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号