Web应用中避免Form重复提交的三种方案

web|重复|重复提交

  前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现:

  1、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" >

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

<html:form action="myAction.do" method="post"     >      <html:image   styleId="submitInput"  src="http://www.webjx.com/htmldata/2005-05-09/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. //验证事务控制令牌,<?XML:NAMESPACE PREFIX = HTML />会自动根据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
, return
, 重复请求
, request
, 令牌
, iOSCognito令牌
, 一个
, web防止重复提交
重复提交请求
避免重复提交、ajax避免重复提交、php避免重复提交、避免表单重复提交、如何避免表单重复提交,以便于您获取更多的相关知识。

时间: 2016-07-07

Web应用中避免Form重复提交的三种方案的相关文章

JSP避免Form重复提交的三种方案

js|重复|重复提交 1 javascript ,设置一个变量,只允许提交一次. <script language="javascript"> var checkSubmitFlg = false; function checkSubmit() { if (checkSubmitFlg == true) { return false; } checkSubmitFlg = true; return true; } document.ondblclick = function

JSP避免Form重复提交的三种方案_JSP编程

1 javascript ,设置一个变量,只允许提交一次. <script language="javascript"> var checkSubmitFlg = false; function checkSubmit() { if (checkSubmitFlg == true) { return false; } checkSubmitFlg = true; return true; } document.ondblclick = function docondblcl

JavaScript中避免Form重复提交的两种方案

1.javascript ,设置一个变量,只允许提交一次. <script language="javascript"> var checkSubmitFlg = false; function checkSubmit() { if (checkSubmitFlg == true) { return false; } checkSubmitFlg = true; return true; } document.ondblclick = function docondblcl

php解决和避免form表单重复提交的几种方法_php技巧

前言 为什么要避免form表单被重复提交呢?因为我们不想让我们的服务器重复处理没必要的数据,同时我们也是避免我们的数据库产生重复的数据,避免表单重复提交也是让我们的网站更安全的一种表现. 先看一下有哪些情况下回导致表单重复提交呢,知道哪些情况下可能会出现表单重复提交就可以从根源处理表单重复提交的情况了. 下面的情况就会导致表单重复提交:       点击提交按钮两次.       点击刷新按钮.       使用浏览器后退按钮重复之前的操作,导致重复提交表单.       使用浏览器历史记录重复

asp中实现限制重复提交同一表单

重复|重复提交 在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单.缺乏这种限制有时候会产生某些预料不到的结果,如重复订阅邮件服务或重复投票等.或许一些asp初学者并不清楚在asp应用中如何限制重复提交同一表单,所以在这里向大家介绍在ASP应用中防止用户在当前会话期间多次提交同一表单的一个简单方法. 这个工作主要由四个子程序组成,在较为简单的应用场合,你只要将这些代码放在包含文件中直接引用即可:对于那些较为复杂的环境,我们在文章的最后给出一些改进建

解析php防止form重复提交的方法

本篇文章是对php防止form重复提交的方法进行了详细的分析介绍,需要的朋友参考下   php 防止表单重复提交实例: 复制代码 代码如下: <?php session_start(); $_SESSION['fsess']=($_SESSION['fsess'])?$_SESSION['fsess']:time(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt

jQuery的 $.ajax防止重复提交的两种方法(推荐)_jquery

下面给大家带来两种关于jquery 的ajax防止重复提交的解决方法,具体介绍如下所示: 1.第一种,对于onclick事件触发的的ajax 可以采用如下方法: 即在beforeSend中使点击按钮不可用,ajax结果返回后置为可用 $.ajax( { type: 'POST', url: APP+'?m=Shopping&a=ajaxSubmitorder&sid='+sid+'&src='+src, cache:false, dataType: 'json', data: {'

就像这样子的就可以啦-跪求一份简单文本编辑器插件,能copy在java web项目中就能运行的那一种

问题描述 跪求一份简单文本编辑器插件,能copy在java web项目中就能运行的那一种 解决方案 http://kindeditor.net/demo.php 解决方案二: http://kindeditor.net/demo.php http://ueditor.baidu.com/website/onlinedemo.html http://ckeditor.com/demo

C#中获取、生成随机数的三种方法

  这篇文章主要介绍了C#中获取.生成随机数的三种方法,本文讲解了Random 类生成法.Guid 类生成法以及RNGCryptoServiceProvider 类生成法,需要的朋友可以参考下 随机数的定义为:产生的所有数字毫无关系. 在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号. 在C#中获取随机数有三种方法: 一.Random 类 Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数. 代码如下: Random rd = new R