zoukankan      html  css  js  c++  java
  • 表单的重复提交,解决方案

    表单的重复提交,解决方案:

    第一种情况:在提交表单时,如果网速较差,可能会导致点击提交按钮多次:

    - 解决方法:点击提交按钮之后,使按钮不可用。通过js完成:

    <script type="text/javascript">
        window.onload = function(){ 
            //获取按钮的对象
            var btn = document.getElementById("btn");
            //为按钮绑定单击响应函数
            btn.onclick = function(){     
                //点击以后使按钮不可用
                this.disabled=true;  
                //当将提交按钮设置为不可用时,会自动取消它的默认行为
                //手动提交表单
                this.parentNode.submit();  
            };
        };
    </script>
     
    <form action="${pageContext.request.contextPath }/SessionServlet" >
    user:<input type="text" name="username">
    password<input type="password" name="pwd">
    <input type="submit" value="提交" id="btn"> 
    </form>
    View Code

    第二种情况:表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单:

    - 解决方案:
        使用一个token的机制
              - token就是令牌的意思
              - 服务器在处理请求之前先来检查浏览器的token
              - token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token
              - 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面
              - 服务器所创建的token只能使用一次
              - token一般使用一个唯一的标识

    - 在jsp页面,获取uuid作为token 

      - UUID:32位字符串,通常作为对象或者表的唯一标识,根据机器码和时间戳(从1970年1月1日开始到现在)生成。

    <%
        String uuid = UUID.randomUUID().toString();
        session.setAttribute("uuid", uuid);
    %>
    
    ${errormsg }
    <form action="${pageContext.request.contextPath }/SessionServlet" >
      <input type="text" name="uuid" value="<%=uuid %>"/>
      user:<input type="text" name="username">
      password<input type="password" name="pwd">
      <input type="submit" value="提交" ">
    </form>
    View Code

    在servlet页面:

    String reqUUID = request.getParameter("uuid");
    HttpSession session = request.getSession();
    String sessUUID = (String) session.getAttribute("uuid");
    session.removeAttribute("uuid");
         
    if(reqUUID.equals(sessUUID)){
        response.sendRedirect(request.getContextPath()+"/login_success.jsp");
        System.out.println("已经插入");
    }else{
        request.setAttribute("errormsg", "重复登陆");
        request.getRequestDispatcher("/3.jsp").forward(request, response);
    }
    View Code

    实例-具体使用:

    封装成工具类:

     1 public class RepeatSubmitUtil {
     2     public static Result compareSession(HttpServletRequest request, HttpServletResponse response,
     3                                         String reqUUID){
     4         Result result = new Result();
     5         HttpSession session = request.getSession();
     6         String sessUUID = (String) session.getAttribute("uuid");
     7         session.removeAttribute("uuid");
     8         if(reqUUID.equals(sessUUID)){
     9             result.setCode("0000");
    10             System.out.println("已经插入");
    11         }else{
    12             result.setCode("9999");
    13             System.out.println("重复登陆");
    14         }
    15           return result;
    16     }
    17 }
    View Code

     controller代码:

    jsp代码:

     - 表单重复提交的危害:
             - 向数据库中插入大量的重复且没有意义的数据,占用服务器的资源
             - 处理请求服务器并没有检查请求是否为重复的请求,导致恶意的攻击

  • 相关阅读:
    动态添加删除控件
    文件下载源码
    poj 1300 欧拉回路、通路 解题报告
    hdu 1232 并查集 或者 深搜
    hdu 2546 01背包问题
    强连通图的判断 hdu 1269
    hdu 2159 二维费用背包问题
    Hdu 3336 kmp+dp解题报告
    hdu 3639 强连通练习使用
    hdu 1712 分组背包问题
  • 原文地址:https://www.cnblogs.com/dw3306/p/9331121.html
Copyright © 2011-2022 走看看