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代码:

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

  • 相关阅读:
    CTFHub题解-技能树-Web-文件上传(00截断、双写后缀)【三】
    CTFHub题解-技能树-Web-文件上传(.htaccess、MIME绕过、文件头检查)【二】
    CTFHub题解-技能树-Web-文件上传(无验证、前端验证)【一】
    CTFHub题解-技能树-Web-SQL注入(Cookie注入、UA注入、Refer注入)【三】
    记一次centos7重启后docker无法启动的问题
    ctfshow——web_AK赛
    Windows10安装MongoDB
    centOS7安装docker和docker-compose
    xray—学习笔记
    ctfhub技能树—sql注入—过滤空格
  • 原文地址:https://www.cnblogs.com/dw3306/p/9331121.html
Copyright © 2011-2022 走看看