A-A+

防止表单重复提交实现代码

2016年01月18日 前端设计 暂无评论 阅读 8 views 次

重复提交、重复刷新、防止后退等等都是属于系统为避免重复记录而需要解决的问题,在客户端去处理需要针对每一种的可能提出相应的解决方案,然而在服务器端看来只不过是对于数据真实性的检验问题,基于令牌的处理就是一劳永逸的方法,代码如下:

  1. <script Language='JavaScript'>  
  2. function formsubmit() {  
  3.     Today = new Date();  
  4.     var NowHour = Today.getHours();  
  5.     var NowMinute = Today.getMinutes();  
  6.     var NowSecond = Today.getSeconds();  
  7.     var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond;  
  8.     if((mysec-document.formsubmitf.mypretime.value)>600){  
  9.         //600只是一个时间值,就是5分钟内禁止重复提交,值随便设  
  10.         document.formsubmitf.mypretime.value=mysec;  
  11.     }  
  12.     else{  
  13.         alert(' 按一次就够了,请勿重复提交!请耐心等待!谢谢合作!');  
  14.         return false;  
  15.     }  
  16.     document.forms.formsubmitf.submit();  
  17. }  
  18. </script>  

防止网页后退–禁止缓存

通过控制浏览器的缓存及页面的有效期,当在重定向之后的新页面上点击浏览器后退按钮时,会提示”网页已过期”,从而防止后退时导致表单被提交。但这种方式不是对所有浏览器都是有效的,所以要考虑后再使用。在response时在header中添加如下代码来控制浏览器的缓存及网页的有效期限或直接在网页的中添加,代码如下:

  1. <?php  
  2. //.....  
  3. ///在IE 4或5中,Cache-Control标记将被忽略,不起作用  
  4. header('Cache-Control: no-cache');  
  5. header('Expires: 0');  
  6. //对于https有效,与“Expires: -1”相同,此时浏览器仍旧缓存页面,但把页面标记为立即过期  
  7. header('Pragma:no-cache');  
  8. //....  
  9.   
  10. ?>  

action有这样的一个方法生成令牌,代码如下:

  1. protected String generateToken(HttpServletRequest request) {   
  2.        HttpSession session = request.getSession();   
  3.        try {   
  4.            byte id[] = session.getId().getBytes();   
  5.            byte now[] =   
  6.                new Long(System.currentTimeMillis()).toString().getBytes();   
  7.            MessageDigest md = MessageDigest.getInstance("MD5");   
  8.            md.update(id);   
  9.            md.update(now);   
  10.            return (toHex(md.digest()));   
  11.        } catch (IllegalStateException e) {   
  12.            return (null);   
  13.        } catch (NoSuchAlgorithmException e) {   
  14.            return (null);   
  15.        }   
  16.    }  

asp来做实例

表单文件formtest.asp,代码如下:

  1. <%  
  2.   Randomize '初始代随机数种子  
  3.   num1=rnd() '产生随机数num1  
  4.   num1=int(26*num1)+65 '修改num1的范围以使其是A-Z范围的Ascii码,以防表单名出错  
  5.   session("antry")="test"&chr(num1) '产生随机字符串  
  6. %>  
  7. <form name="test" action="testact.asp" method="post">  
  8. 你的名字:<input type='text' name='' size=30>  '注意本行中使用了随机表单项名  
  9. <input type='submit' value='提交'>  
  10. </form>  

表单处理程序testact.asp,代码如下:

  1. <%  
  2.   teststr=request.form(session("antry"))  
  3.   if teststr="" then  
  4.    response.write "没有填写姓名或重复提交"  
  5.    '由于用户没有填写名字,或表单被重复提交(标志为session("antry")为空)引起  
  6.   else  
  7.    response.write teststr  
  8.    session("antry")=""  '提交成功,清空session("antry"),以防重复提交!!  
  9.   end if  
  10. %>  

在这里,你只需随机化一个必填项目的表单项名即可,不必随机化所有的表单项目.

标签:

给我留言