• 防止表单重复提交


    1.方法一

    在servlet中模拟网络延迟造成表单重复提交

     //解决表单重复提交方法
           
            //接收数据
            String username = req.getParameter("username");
            System.out.println("接收的数据为:"+username);
          
            try {
                //模拟网络延迟
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //返回数据
            resp.getWriter().write("success");
    
        }

    编写jsp页面  

    <head>
        <title>解决表单重复提交</title>
        <script type="text/javascript">
            //创建一个变量 false代表没有点击过 true代表已经点击过
            var flag=false;
    
            function formSubmit() {
                if(!flag){
                    flag=true;
                    return true;
                }else{
                    return  false;
                }
            }
    
    </head>
    <body>
    <form action="FormServlet" onsubmit="return formSubmit()" method="post">
        <input type="hidden" id="hiddenToken" name="formToken"/>
        <input type="text" name="username"/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    

      

    方法二:使用Token令牌完成防止表单重复提交

    编写servlet1

    //方法二:Token解决表单重复提交
            //生成令牌
            String token= UUID.randomUUID().toString();
            //令牌保存到session中
            req.getSession().setAttribute("sessionToken",token);
            //响应
            resp.getWriter().write(token);
            

    编写servlet2

     //解决表单重复提交方法
            //验证令牌
            //获取页面提交的隐藏域数据
            String formToken = req.getParameter("formToken");
            //获取Session中的Token
            String sessionToken = (String)req.getSession().getAttribute("sessionToken");
            //如果页面中获取的和session中不一致,代表已经提交过了,不要重复提交
            if(!formToken.equals(sessionToken)){
                resp.getWriter().write("不要重复提交~");
                return;
            }
    
            //接收数据
            String username = req.getParameter("username");
            System.out.println("接收的数据为:"+username);
            //必须将token清空,不然永远是一致的
            req.getSession().removeAttribute("sessionToken");
    
            try {
                //模拟网络延迟
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //返回数据
            resp.getWriter().write("success");
    
        }

    编写jsp页面

    <head>
        <title>解决表单重复提交</title>
        <script type="text/javascript">
            //创建一个变量 false代表没有点击过 true代表已经点击过
            var flag=false;
    
            function formSubmit() {
                if(!flag){
                    flag=true;
                    return true;
                }else{
                    return  false;
                }
            }
    
            //Token解决表单重复提交
            $(function () {
                //生成令牌
                $.ajax({
                    url:"TokenServlet",
                    type:"post",
                    success:function (token) {
                        $("#hiddenToken").val(token);
                    }
                })
            })
        </script>
    </head>
    <body>
    <form action="FormServlet" onsubmit="return formSubmit()" method="post">
        <input type="hidden" id="hiddenToken" name="formToken"/>
        <input type="text" name="username"/>
        <input type="submit" value="提交"/>
    </form>
    </body>
  • 相关阅读:
    safari兼容时间格式 NAN
    高阶组件
    SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)
    SQL Server 触发器
    浅谈数据库中的触发器
    SQL Server 2008 表变量参数(表值参数)用法
    SQL Server 批量插入数据的两种方法
    SQL Server 2008 R2 主从数据库同步
    C#操作FTP, FTPHelper和SFTPHelper
    orcherd 汉化
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12269307.html
Copyright © 2020-2023  润新知