zoukankan      html  css  js  c++  java
  • 表单重复提交问题

    表单重复提交------同一表单的内容多次重复提交到服务器

           比如插入数据时,同一表单多次提交,就会在数据库中插入多条重复的该条记录,造成严重的问题

    表单重复提交分为三种情况:

    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一般使用一个唯一的标识。

                


    相关代码:

            登录页面代码:

    <body>
    <%
    	UUID uuid=UUID.randomUUID();
    	String id=uuid.toString();
    	session.setAttribute("Uid", id);
    %>
    	<table>
    		<form method="get" action="/day815/LoginServlet">
    		<input type="hidden" name="uid" value="<%=id%>">
    		用户名:<input type="text" name="username">
    		密码:<input type="password" name="password">
    		<input type="submit" value="提交">
    		</form>
    	</table>
    </body>
           LoginServlet中的代码:

    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!!!");
    		}
    	}

               第三种问题的解决方法同时可以解决前两种问题

  • 相关阅读:
    CentOS系统下NFS服务器
    网络封包分析
    Android端抓包方法
    SQL Server 2008从基础开始学习的历程(1)------创建表与查询
    序--CentOS6.5 mini 安装和基本配置
    MonkeyRunner(猴哥快跑)常用类方法总结
    python 开源数据抓取框架scrapy
    pycharm最新版注册
    python flask下传数据到js
    centos打架django + mysql环境
  • 原文地址:https://www.cnblogs.com/mazhitao/p/7424419.html
Copyright © 2011-2022 走看看