JavaWeb开发中防止表单重复提交

第一种方式:

可以在客户端利用Javascript对表单重复提交作验证,主要实现手段是在这个表单触发表单提交事件的时候调用一个Javascript编写的函数,这个函数: 
<script> 
var isCommitted = false; 
function checkPost() 

if(!isCommitted) 

   isCommitted = true; 
   return true; 

else 

   alert("不能重复提交表单"); 
   return false; 


</script> 

<form action="servlet/RepeateFormServlet" method="POST" onsubmit="return checkPost()">... 

第二种方式:利用验证码 
  由于每次表单的提交都需要一个验证码这个验证码在服务器端是唯一的每次表单提交的验证码是不同的可以根据每次提交上来的验证码与服务器端的中的session中的验证码进行匹配 

第三种方式:利用一个时间令牌(可以使任意的令牌只要是唯一的就可以) 

产生这个唯一令牌 

如:<% 
      Date   nowDate =    new Date(); 
      String nowDateString  = new  Long(nowDate.getTime()).toString(); 
      session.setAttribute("tokenTime",nowDateString); 
%> 
  
通过一个表单隐藏的字段传递这个令牌 

<input type="hidden"  name="tokenTime" value="<%=nowDateString%>"> 

接下来在服务器端中的session中获取这个时间令牌然后与这个表单的隐藏字段进行比较 
相同则提交表单并且把这个session中的tokenTime删除 
session.setAttribute("tokenTime",nowDateString); 
反之.... 


第四种方式:基于Struct框架的解决方案 

Struct框架中提供了一个Token机制来解决表单的重复提交 
使用这个Token应注意: 

 JSP必须是通过一个Action进行转发并且在这个Action中调用saveToke(request); 
  这个方法向导向的JSP中保持一个唯一的Token 

然后在一个处理表单的Action中调用isTokenVaild(request,true)方法来验证这个表单是否被重复提交 

实现原理:当调用saveToken(request)时候服务器向JSP中输出一个唯一的Token服务器端也保存相同的一份当提交这个表单的时候调用isTokenValid(request,ture)进行校验后服务器又会生出一个新的Token发送给表单JSP中服务器端的Token不发送改变,当客户端再次提交这个表单的时候调用isTokenValid(request,ture)方法进行校验此时这个Token不一致则不会重复提交表单 

猜你喜欢

转载自tzz6.iteye.com/blog/2195078