在注册网站,提交信息经常会因为网络等原因导致提交信息非常缓慢,这样用户会因为等待的时间过长所以产生重复提交的信息的操作,然而重复提交信息显然是不能在次写进数据库或数据存等,因此进行重复提交的处理就非常必要了。
重复提交的问题处理的核心在于:
阻止多次信息的提交,确保一份信息能够正确的写入数据库。
在做重复提交的验证的主要对表单的操作:
重复提交的思路是:
1.初始化一个标志
2.提交信息的标志与初始化的标志进行比较和判断,有两种情况:
2.1、相同,表示第一次提交信息,这样就直接提交信息表单等,
并且关键的步骤是修改初始化标志,以保证重复提交的判断信息的标志
2.2 不相同,表示重复提交,这样就可以阻止表单信息等提交到数据存储器
3.根据判断的情况来进行页面的跳转,这样就可以阻止用户的重复提交。
对于重复提交的处理方法还有很多:
1、在客户端进行处理的时候可以采用,限制用户重复提交的操作,比如:在用户提交完成信息的时候,可以将提交按钮禁用,然后设置一定的时间间隔来提示用户,当在指定的时间内没有反映的时候,提交按钮有可以再次使用,对于指定时间则要根据用户提交的信息是否正确提交来进行判断。
2、在客户端提交信息完成后,同样的方式,可以使用人性化的提示信息来提示用户。
下面是一个简单的阻止重复提交的方案:
第一次注册自然注册成功:
当未关闭浏览器的时候,回退浏览器的时候,再次注册则提示已经注册成功,
这只是一个实例,对于阻止重复提交的流程如下:
实例代码:
初始化标记的Servlet:
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class InitalServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- doPost(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- long token=System.currentTimeMillis();
- request.getSession().setAttribute("token", token);
- response.sendRedirect("register.jsp");
- }
- }
简单的注册信息模拟:
- <body>
- <form action="check/SubmitCheckServlet" method="post">
- <table border="1" align="center">
- <tr>
- <td>
- <input type="hidden" id="tagSubmit" name="tagSubmit" value="${sessionScope.token }"/>
- <input type="submit" id="register" value="Register" />
- </td>
- </tr>
- </table>
- </form>
- </body>
对于提交进行处理的Servlet:
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class SubmitCheckServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doPost(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- HttpSession httpSession=request.getSession();
- long token=System.currentTimeMillis();
- if((Long)httpSession.getAttribute("token")==Long.parseLong(request.getParameter("tagSubmit"))){
- httpSession.setAttribute("token", token);
- response.sendRedirect("../succeed.jsp");
- }else{
- response.sendRedirect("../msg.jsp");
- }
- }
- }
下面是跳转的页面:
第一次提交:succeed.jsp
- <body>
- <h1 align="center">恭喜你注册成功<br/>${sessionScope.token }</h1>
- </body>
重复提交:msg,jsp
- <body>
- <h1 align="center">对不起你已经注册成功了<br/>${sessionScope.token }</h1>
- <h2 align="center"><a href="succeed.jsp">点击进入>>></a></h2>
- </body>
用到了两个Servlet,配置相关的Servlet的Web.xml
- <servlet>
- <description>This is the description of my J2EE component</description>
- <display-name>This is the display name of my J2EE component</display-name>
- <servlet-name>InitalServlet</servlet-name>
- <servlet-class>servlet.InitalServlet</servlet-class>
- </servlet>
- <servlet>
- <description>This is the description of my J2EE component</description>
- <display-name>This is the display name of my J2EE component</display-name>
- <servlet-name>SubmitCheckServlet</servlet-name>
- <servlet-class>servlet.SubmitCheckServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>InitalServlet</servlet-name>
- <url-pattern>/InitalServlet</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>SubmitCheckServlet</servlet-name>
- <url-pattern>/check/SubmitCheckServlet</url-pattern>
- </servlet-mapping>
对于重复提交问题的产生主要有一下几个方面:
1、网络速度很慢,信息提交慢
2、提交的网站的服务器繁忙,处理信息和处理后的反馈信息没能即使到达客户端
3、用户所在的网页由于特定原因已经过期,因此提交自然重复,但是仍然不能得到相应,不过这一种不算是真正意义上的重复提交,站在用户的角度确实是重复提交,但对于服务器始终就没有与该网页建立通信,因此不能算是重复提交。
对于阻止用户重复提交还有很多的的处理方法,对于特定的问题采用适合的处理方式,达到处理的目的以及高效,安全。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/854976,如需转载请自行联系原作者