表单重复提交------同一表单的内容多次重复提交到服务器
比如插入数据时,同一表单多次提交,就会在数据库中插入多条重复的该条记录,造成严重的问题
表单重复提交分为三种情况:
1.提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。- 这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面。- 这样整一个业务,只发送了一次请求,那么当你在浏览器中点击刷新按钮或者狂按f5会一直都会刷新之前的请求
解决方案:在Servlet中使用重定向跳转到目标界面,尤其是在增删改数据时,不能使用转发跳转。
2.在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。- 产生的原因:是因为咱们的提交按钮可以点击多次。
解决方案:使提交按钮只能点击一次。这事咱们得通过js来完成。
window.onload = function(){ //获取按钮的对象 var btn = document.getElementById("sub_btn"); //为按钮绑定单击响应函数 btn.onclick = function(){ //点击以后使按钮不可用 this.disabled=true; //当将提交按钮设置为不可用时,会自动取消它的默认行为 //手动提交表单 this.parentNode.submit(); }; };3.表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。
- 产生的原因:因为服务器在处理请求时,不会检查是否为重复提交的请求。 - 解决方案:使用一个token的机制。- token就是令牌的意思。- 服务器在处理请求之前先来检查浏览器的token。- token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token- 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面- 服务器所创建的token只能使用一次。- token一般使用一个唯一的标识。
相关代码:
登录页面代码:
<% UUID uuid=UUID.randomUUID(); String id=uuid.toString(); session.setAttribute("Uid", id);%>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password=request.getParameter("password"); String uuid=request.getParameter("uid"); System.out.println(uuid); HttpSession session = request.getSession(); String Uid=(String) session.getAttribute("Uid"); session.removeAttribute("Uid"); if(uuid.equals(Uid)){ String sql="select * from user where Name=? and Password=?"; User user=Jdbcutil.findByNameAndPassword(sql, username, password); if(user!=null){ //request.getRequestDispatcher("/login-success.jsp").forward(request, response); session.setAttribute("user", user); response.sendRedirect(request.getContextPath()+"/login-success.jsp"); }else{ response.sendRedirect(request.getContextPath()+"/login-error.jsp"); } }else{ response.getWriter().println("login false!!!"); } }第三种问题的解决方法同时可以解决前两种问题