`

防止页面被多次提交

阅读更多

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" onsubmit="return checkSubmit();">  

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

<html:form action="myAction.do" method="post" onsubmit="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); 
   }
 
}
 
分享到:
评论

相关推荐

    Asp.net防止页面被多次提交

    Asp.net防止页面被多次提交

    Asp.net中防止用户多次登录的方法

    Asp.net中防止用户多次登录的方法,详细解说,希望大家支持

    cf7-no-double-submit:联系表格7防止多次提交WordPress插件

    联系表格7防止多次提交WordPress插件 通过enablinig这个插件,当Contact Form 7仍在提交导致多次相同提交通过的表单时,它可以防止双击。 对于联系表7版本4.9或更高版本。 安装 通过此存储库下载此插件-单击“克隆或...

    Asp.net中阻止页面按钮多次提交的解决办法

    主要介绍了Asp.net中阻止页面按钮多次提交的解决办法的相关资料,需要的朋友可以参考下

    ThinkPHP防止重复提交表单的方法实例分析

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

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

    这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。 我之前的文章曾说过用一些Jquery插件效果不错。 Post/Redirect/Get模式。在提交后执行页面重定向,这就是

    Android如何防止多次点击事件

    恐怕大家都会遇到这样的问题,一个点击事件多次触发,导致,同样的内容提交了多次,或者说弹出多个页面… onClick事件是Android开发中最常见的事件。比如,一个submitButton,功能是点击之后会提交一个订单,则一般...

    防止在服务器处理完成之前用户多次点击提交按钮处理代码

    如果网页速度过慢或者其他原因,用户多次提交能导致数据的修改,怎么解决这个问题呢? 这段是放在 Page_Load 中 代码如下: if(!Page.IsPostBack) { System.Text.StringBuilder s = new System.Text.StringBuilder();...

    解决vue 按钮多次点击重复提交数据问题

    主要介绍了vue 按钮多次点击重复提交数据的问题,本文通过实例结合的形式给大家介绍的非常详细,需要的朋友可以参考下

    ThinkPHP 防止表单重复提交的方法

    极端的情况,若用户在页面间切换多次,那么多点几次后退按钮很可能又回到了上一个表单页面。 解决办法是在http头中设置Cache-Control: no-cache, no-store。然而我尝试了无论是在页面head中添加 &lt;meta ...

    PHP防止表单重复提交的几种常用方法汇总

    采用这种方法可以防止多次点击的发生,实现方式较简单。 缺点是若客户端禁止JavaScript脚本,则失效。 2. 在提交成功后执行页面重定向(redirect)。转到提交成功信息页面。 特点:避免F5重复提交,消除浏览器前进和...

    ASP.NET 多次提交的解决办法

    只要把这2个方法放到页面最下面(就是调用scriptmanager的RegisterStartupScript方法)

    Chrome Form多次提交表单问题的解决方法

    第一次提交可以,第二次提交就没有任何响应了。需要重新加载页面后才可以提交,而这个问题在Firefox,IE下没有出现。 马上Google了一下发现这是webkit内核浏览器的共有特性,这样做是为了防止表

    Vue 利用指令实现禁止反复发送请求的两种方法

    前端做后台管控系统,在某些接口请求时间过长的场景下,需要防止用户反复发起请求。  假设某场景下用户点击查询按钮后,后端响应需要长时间才能返回数据。那么要规避用户返回点击查询按钮无外乎是让用户无法在合理...

    ASP.NET 多次提交的解决办法2

    对“添加”、“提交”、“保存”、“更新”等按钮需要对数据库进行写操作的按钮,一定要在页面初始化时加载脚本,防止多次重复点击

    小程序按钮避免多次调用接口和点击方案实现(不用showLoading)

    本来是用showLoading的,点击直接转菊花,但是呢,showLoading和 showToast这个方法是冲突的,你转了菊花不能弹toast提示,在某个页面需要提交一次表单和做输入验证,测试说可以点击多次 然后想到可以用一个变量判断...

    whmcs5.03破解版.rar

    a:修改使用checkCbTransID函数判断刷新多次提交为使用操作数据库查询 b:在alipay_callback成功后输出success。防止支付宝服务器多次post数据 3.WHMCS 支付宝(ALIPAY)全功能接口 支持支付宝签约的全三种模式. ...

    一个将页面元素设为不可用(Disabled)的 jQuery 插件

    该插件可以将一个页面元素设为不可用,大部分情况下,当用户点击了一个空间提交数据到服务器,为了防止用户重复点击造成多次提交的情况下调用,在Ajax的情况下,当数据返回回来,有可能需要将该控件重新设为可用,该...

    漂亮且完整的HTML5信息注册页面及后台实现

    使用Ajax进行提交,通过Cookies防止用户多次提交,后台使用asp.net接受ajax请求,并将数据插入数据库,整个项目从前端到后台还是比较完整的,里面不含数据库,数据库可以震惊aspx里面的字段代码自行创建。...

    控制页面按钮在后台执行期间不重复提交的JS方法

    如果在点了一个按钮,提交到后台执行期间,再点一次按钮,会出现两种情况,一种是执行了两次后台代码,另一种是等待前一次的提交动作执行完后再次执行提交动作,无论是哪一种,都是跑了两遍后台代码,这是很多情况下...

Global site tag (gtag.js) - Google Analytics