二次提交的避免方法(源于互联网)=>个人总结

第一种:用flag标识,下面的代码设置checkSubmitFlg标志;
第二种:在onsubmit事件中设置,在第一次提交后使提交按钮失效,感兴趣的朋友可以了解下

第一种:用flag标识,下面的代码设置checkSubmitFlg标志:
复制代码 代码如下:

<script language="”javascript”">

var checkSubmitFlg = false;

function checkSubmit(){

if(checkSubmitFlg ==true){ return false; //当表单被提交过一次后checkSubmitFlg将变为true,根据判断将无法进行提交。

}

checkSubmitFlg ==true;

return true;

}

< /script >

< form name=”form1” method=”post” οnsubmit=”return checkSubmit();”>

………..< /form>

第二种:在onsubmit事件中设置,在第一次提交后使提交按钮失效,代码如下:
复制代码 代码如下:

<form action=”about:blank” method=”post” onsubmit =”getElementById(‘submitInput').disabled=true;return true;” target=”_blank”>
<input type=”submit” id=”submitInput”/>
</form>
</body>
</html>
</script>

代码如下:

<script Language='JavaScript'>
function formsubmit() {
Today = new Date();
var NowHour = Today.getHours();
var NowMinute = Today.getMinutes();
var NowSecond = Today.getSeconds();
var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond;
if((mysec-document.formsubmitf.mypretime.value)>600)
//600只是一个时间值,就是5分钟内禁止重复提交,值随你高兴设
{
document.formsubmitf.mypretime.value=mysec;
}
else
{
alert(' 按一次就够了,请勿重复提交!请耐心等待!谢谢合作!');
return false;
}
document.forms.formsubmitf.submit();
}
</script>

</HEAD>

<BODY BGCOLOR="#FFFFFF">
<form name=formsubmitf id ="the" method="post" action="XXX.asp">
<input type=hidden name='mypretime' value='0'> //这句不能少,用隐含变量传递一个时间初值

//这里是你要提交的内容

<input type="button" value="写好了" name="button1" class="4round" οnclick='formsubmit()'> <font class="red">(请按一次,耐心等待!)</font> <input type="reset" value="重 写" name="button2" class="4round">
</form>



三: token


避免二次提交

控制方式:
由于咱们前期曾经尝试过通过把按钮置灰的方式来控制二次提交,所以此次尝试前台和后台结合的方式来控制二次提交;

原理:
在需要防止二次提交的页面,增加一个令牌token,在提交的时,拿此token与,平台预先定义好的并存放在session中的token做比较,如果相等,则放行,然后把session的token给修改掉(此处有几处需要还原token的逻辑),如果不相等(即二次或者多次提交的情况),则屏蔽此次提交;

代码实现:

1. 在页面增加token隐藏域,value 值为uuid生成的随机码,同时在session中保留一份,
2. 增加拦截器PreventSecondSubmitInterceptor,完成页面上提交的token与 session中token的对比
3. 增加header标识;这个存在争议,看看是否有更好的办法?现在这个是解决直接output输出的这种情况;


增加此标识解决的问题是:如果是验证逻辑,目前咱们系统的代码基本上都是往前台直接输出的,想要还原session,就需要记录此种情况。

个人建议:
其实咱们系统中是支持直接抛异常的来处理验证这种情况,建议废除,直接output这种方式,这样只需要catch一下,
就搞定了,不需要增加header,是为了兼容;咱们系统的ajaxsave 方法及其与其关联的两个方法inisave和postsave,
建议不要把异常吃掉,建议抛出;因为异常拦截器,已经处理了此种情况;(应该可以解决,目前没有做验证)

4. sesssion token对应的类型是map,原来是字符串,修改的原因:解决多层弹出编辑页面,父页面不能提交的问题;
   struts解决此问题的方法是:自己需要指定 隐藏域的 name,不然也会出现此问题;

struts的二次提交解决方案:有兴趣的可以研究研究;两个拦截器:

TokenInterceptor与TokenSessionStoreInterceptor

 
区别是:第一个拦截器,重复提交时,跳转到一个中间页面

       第二个拦截器,重复提交时,跳转到正常提交后的返回页面,只是除了第一次请求正确执行外,其他被屏蔽,这个操作对用户透明,用户是感觉不到的;咱们系统目前没有发现这个问题;



以上有一部分,参考其他学者,侵权必删.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shaun-sheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值