防止表单重复提交

一、防止表单重复提交一

  网络延迟,在网络延迟时间内,频繁的提交表单
   只能提交一次,监控表单的提交事件,通过一个boolean类型的变量来区分已经点击过还是没有点击,如果已经点击过,表单就不提交,没有点击过再提交

1、目录展示

  

2、导入依赖

  

3、form.jsp

<%--
  Created by IntelliJ IDEA.
  User: zheng
  Date: 2020/2/6
  Time: 15:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>解决表单重复提交案例</title>
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
        //创建一个变量   false代表没有点击过,true代表已经点击过
        var flag=false;
        function formSubmit() {
            if(!flag){      //取反值为false
                flag=true;
                return true;
            }else {
                return false;
            }
        }
    </script>
</head>
<body>
    <form action="FormServlet" method="post">
        内容:<input type="text" name="username"/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

4、FormServlet

package com.b;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/FormServlet")
public class FormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收数据
        String username = request.getParameter("username");
        System.out.println("接收的数据:"+username);

        try {
            //模拟网络延迟
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //返回数据
        response.getWriter().write("success");
    }
}

5、效果展示(只允许一次提交)

  

  

  

二、重新加载或者后退页面

  思路如下:在访问登录页面的时候,创建一个 Token令牌(当作一个标识) ,保存到session当中,然后在表单提交的时候将令牌一起提交
   后台Servlet去判断session当中的令牌和表单提交的令牌是否相等,如果相等代表正常提交(session清空),如果不相等,代表非正常提交

1、目录展示

  

2、导入依赖

  

3、TokenForm.jsp

<%--
  Created by IntelliJ IDEA.
  User: zheng
  Date: 2020/2/6
  Time: 15:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>解决表单重复提交案例</title>
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
        //创建一个变量   false代表没有点击过,true代表已经点击过
        var flag=false;
        function formSubmit() {
            if(!flag){      //取反值为false
                flag=true;
                return true;
            }else {
                return false;
            }
        }
        $(function () {
            //生成令牌
            $.ajax({
                url:"TokenServlet",
                type:"POST",
                success:function (token) {
                    $("#hiddenToken").val(token);
                    alert(token)
                }
            })
        })
    </script>
</head>
<body>
    <form action="FormServlet" method="post">
        内容:<input type="text" name="username"/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

4、TokenServlet

package com.b;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;

@WebServlet("/TokenServlet")
public class TokenServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //生成令牌
        String token = UUID.randomUUID().toString();
        //令牌保存到session当中
        request.getSession().setAttribute("sessionToken",token);
        //响应
        response.getWriter().write(token);
    }
}

5、TokenFormServlet

package com.b;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/TokenFormServlet")
public class TokenFormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //验证令牌
        //获取页面提交的隐藏域数据
        String formToken = request.getParameter("formToken");
        //获取Session中的token
        Object sessionToken = request.getSession().getAttribute("sessionToken");
        //如果页面获取的喝session中不一样,代表已经提交过了,不能重复提交
        if (!formToken.equals(sessionToken)){
            System.out.println(sessionToken);
            response.getWriter().write("不能重复提交!");
            return;
        }


        //接收数据
        String username = request.getParameter("username");
        System.out.println("接收的数据:"+username);

        try {
            //模拟网络延迟
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //返回数据
        response.getWriter().write("success");
    }
}

6、效果展示

  

   

   

原文地址:https://www.cnblogs.com/Zzzzn/p/12269140.html