如何阻止页面信息重复提交-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

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

简介:

在注册网站,提交信息经常会因为网络等原因导致提交信息非常缓慢,这样用户会因为等待的时间过长所以产生重复提交的信息的操作,然而重复提交信息显然是不能在次写进数据库或数据存等,因此进行重复提交的处理就非常必要了。
   
   重复提交的问题处理的核心在于:
   阻止多次信息的提交,确保一份信息能够正确的写入数据库。
   
   在做重复提交的验证的主要对表单的操作:
   
   重复提交的思路是:
  
 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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: