如何阻止页面信息重复提交

简介:

在注册网站,提交信息经常会因为网络等原因导致提交信息非常缓慢,这样用户会因为等待的时间过长所以产生重复提交的信息的操作,然而重复提交信息显然是不能在次写进数据库或数据存等,因此进行重复提交的处理就非常必要了。
   
   重复提交的问题处理的核心在于:
   阻止多次信息的提交,确保一份信息能够正确的写入数据库。
   
   在做重复提交的验证的主要对表单的操作:
   
   重复提交的思路是:
  
 1.初始化一个标志
 2.提交信息的标志与初始化的标志进行比较和判断,有两种情况:
  2.1、相同,表示第一次提交信息,这样就直接提交信息表单等,
         并且关键的步骤是修改初始化标志,以保证重复提交的判断信息的标志
  2.2 不相同,表示重复提交,这样就可以阻止表单信息等提交到数据存储器
 3.根据判断的情况来进行页面的跳转,这样就可以阻止用户的重复提交。
 
 对于重复提交的处理方法还有很多:
 1、在客户端进行处理的时候可以采用,限制用户重复提交的操作,比如:在用户提交完成信息的时候,可以将提交按钮禁用,然后设置一定的时间间隔来提示用户,当在指定的时间内没有反映的时候,提交按钮有可以再次使用,对于指定时间则要根据用户提交的信息是否正确提交来进行判断。
 2、在客户端提交信息完成后,同样的方式,可以使用人性化的提示信息来提示用户。

下面是一个简单的阻止重复提交的方案:
 
 第一次注册自然注册成功:

 


 当未关闭浏览器的时候,回退浏览器的时候,再次注册则提示已经注册成功,

 

这只是一个实例,对于阻止重复提交的流程如下:

 

实例代码:

初始化标记的Servlet:

 

 
  1. import java.io.IOException;  
  2.  
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.  
  8. public class InitalServlet extends HttpServlet {  
  9.  
  10.       
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13.  
  14.         response.setContentType("text/html");  
  15.         doPost(request, response);  
  16.     }  
  17.  
  18.       
  19.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  20.             throws ServletException, IOException {  
  21.             response.setContentType("text/html");  
  22.             long token=System.currentTimeMillis();  
  23.             request.getSession().setAttribute("token", token);  
  24.             response.sendRedirect("register.jsp");  
  25.     }  
  26.  
  27. }  

简单的注册信息模拟:

 

 
  1. <body> 
  2.         <form action="check/SubmitCheckServlet" method="post"> 
  3.         <table border="1" align="center"> 
  4.         <tr> 
  5.         <td> 
  6.             <input type="hidden" id="tagSubmit" name="tagSubmit" value="${sessionScope.token }"/> 
  7.             <input type="submit" id="register" value="Register" /> 
  8.         </td> 
  9.         </tr> 
  10.         </table> 
  11.         </form> 
  12.     </body> 

对于提交进行处理的Servlet:

 

 
  1. import java.io.IOException;  
  2. import java.io.PrintWriter;  
  3.  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.servlet.http.HttpSession;  
  9.  
  10. public class SubmitCheckServlet extends HttpServlet {  
  11.       
  12.       
  13.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  14.             throws ServletException, IOException {  
  15.         doPost(request, response);  
  16.     }  
  17.       
  18.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         response.setContentType("text/html");  
  21.         HttpSession httpSession=request.getSession();  
  22.         long token=System.currentTimeMillis();  
  23.         if((Long)httpSession.getAttribute("token")==Long.parseLong(request.getParameter("tagSubmit"))){  
  24.             httpSession.setAttribute("token", token);  
  25.             response.sendRedirect("../succeed.jsp");  
  26.         }else{  
  27.             response.sendRedirect("../msg.jsp");  
  28.         }  
  29.       
  30.     }  

下面是跳转的页面:

第一次提交:succeed.jsp

 

 
  1. <body> 
  2.   <h1 align="center">恭喜你注册成功<br/>${sessionScope.token }</h1> 
  3.   </body> 

重复提交:msg,jsp

 

 
  1. <body> 
  2.    <h1 align="center">对不起你已经注册成功了<br/>${sessionScope.token }</h1> 
  3.    <h2 align="center"><a href="succeed.jsp">点击进入&gt;&gt;&gt;</a></h2> 
  4.   </body> 

用到了两个Servlet,配置相关的Servlet的Web.xml

 

 
  1. <servlet> 
  2.     <description>This is the description of my J2EE component</description> 
  3.     <display-name>This is the display name of my J2EE component</display-name> 
  4.     <servlet-name>InitalServlet</servlet-name> 
  5.     <servlet-class>servlet.InitalServlet</servlet-class> 
  6.   </servlet> 
  7.   <servlet> 
  8.     <description>This is the description of my J2EE component</description> 
  9.     <display-name>This is the display name of my J2EE component</display-name> 
  10.     <servlet-name>SubmitCheckServlet</servlet-name> 
  11.     <servlet-class>servlet.SubmitCheckServlet</servlet-class> 
  12.   </servlet> 
  13.  
  14.  
  15.   <servlet-mapping> 
  16.     <servlet-name>InitalServlet</servlet-name> 
  17.     <url-pattern>/InitalServlet</url-pattern> 
  18.   </servlet-mapping> 
  19.   <servlet-mapping> 
  20.     <servlet-name>SubmitCheckServlet</servlet-name> 
  21.     <url-pattern>/check/SubmitCheckServlet</url-pattern> 
  22.   </servlet-mapping> 

对于重复提交问题的产生主要有一下几个方面:
 1、网络速度很慢,信息提交慢
 
 2、提交的网站的服务器繁忙,处理信息和处理后的反馈信息没能即使到达客户端
 3、用户所在的网页由于特定原因已经过期,因此提交自然重复,但是仍然不能得到相应,不过这一种不算是真正意义上的重复提交,站在用户的角度确实是重复提交,但对于服务器始终就没有与该网页建立通信,因此不能算是重复提交。

对于阻止用户重复提交还有很多的的处理方法,对于特定的问题采用适合的处理方式,达到处理的目的以及高效,安全。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/854976,如需转载请自行联系原作者

相关文章
|
3月前
|
开发者
在用户关闭页面时,提示用户有内容未保存-论onbeforeunload事件的用法
在用户关闭页面时,提示用户有内容未保存-论onbeforeunload事件的用法
21 0
|
10月前
|
JavaScript
form表单提交后,页面弹出成功或者失败的信息
form表单提交后,页面弹出成功或者失败的信息
113 0
|
设计模式 JavaScript 数据库
表单防止重复提交的四种方式
表单防止重复提交的四种方式
185 0
|
JavaScript 前端开发
自动提交表单的实现方法
可以解决采集需要自动提交的问题!   方法一:   Untitled Document (1)自动提交表单:    setTimeout("document.form1.submit()",10000)                      10秒后提交。
2330 0
|
存储 SQL 算法
最简单的6种防止数据重复提交的方法!(干货)下
最简单的6种防止数据重复提交的方法!(干货)
305 1
|
存储 前端开发 安全
最简单的6种防止数据重复提交的方法!(干货)上
最简单的6种防止数据重复提交的方法!(干货)
781 0
最简单的6种防止数据重复提交的方法!(干货)上
浅谈一下如何避免用户多次点击造成的多次请求
浅谈一下如何避免用户多次点击造成的多次请求
517 0
|
JavaScript
jQuery 禁用表单提交按钮,防止用户请求重复提交
jQuery 禁用表单提交按钮,防止用户请求重复提交
165 0
jQuery 禁用表单提交按钮,防止用户请求重复提交
|
NoSQL Redis 数据库
重复提交,你是如何处理的?
幂等性就是说无论你执行几次请求,其结果是一样的。说到了幂等就不得不说重复提交了,你连续点击提交按钮,理论上来说这是同一条数据,数据库应该只能存入一条,而实际上存放了多条,这就违反了幂等性。因此我们就需要做一些处理,来保证连续点击提交按钮后,数据库只能存入一条数据。
639 0