zoukankan      html  css  js  c++  java
  • 防止表单重复提交

    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>
  • 相关阅读:
    《Python 源码阅读》之 类型Type
    《Python 源码剖析》之对象
    KMP匹配算法
    Python的递归深度
    js验证手机号
    Jquery 实现 “下次自动登录” 记住用户名密码功能
    js注册读秒进度条
    div+css进度条
    SprignMVC+myBatis整合
    ssm控制输出sql(二)
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12269307.html
Copyright © 2011-2022 走看看