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

    首先前端的实现方式:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>Form表单</title>
    <script type="text/javascript">
        var isFlag = false; //表单是否已经提交标识,默认为false
    
        function submitFlag() {
    
            if (!isFlag) {
                isFlag = true;
                return true;
            } else {
                return false;
            }
    
        }
    </script>
    </head>
    
    <body>
        <form action="${pageContext.request.contextPath}/DoFormServlet"
            method="post" onsubmit="return submitFlag()">
            用户名:<input type="text" name="userName"> <input type="submit"
                value="提交" id="submit">
        </form>
    </body>
    </html>

    方式二:

    function dosubmit(){
        //获取表单提交按钮
        var btnSubmit = document.getElementById("submit");
        //将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮
        btnSubmit.disabled= "disabled";
        //返回true让表单可以正常提交
        return true;
    }

    后端的实现方式:

     具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
      在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

      1. 存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
      2. 当前用户的Session中不存在Token(令牌)。
      3. 用户提交的表单数据中没有Token(令牌)。
    @WebServlet("/ForwardServlet")
    public class ForwardServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getSession().setAttribute("sesionToken", TokenUtils.getToken());
            req.getRequestDispatcher("form.jsp").forward(req, resp);
        }
    }
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>Form表单</title>
    
    </head>
    
    <body>
        <form action="${pageContext.request.contextPath}/DoFormServlet"
            method="post" onsubmit="return dosubmit()">
            <input type="hidden" name="token" value="${sesionToken}"> 用户名:<input type="text"
                name="userName"> <input type="submit" value="提交" id="submit">
        </form>
    </body>
    </html>
    @WebServlet("/DoFormServlet")
    public class DoFormServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            boolean flag = isFlag(req);
            if (!flag) {
                resp.getWriter().write("已经提交...");
                System.out.println("数据已经提交了..");
                return;
            }
            String userName = req.getParameter("userName");
            try {
                Thread.sleep(300);
            } catch (Exception e) {
                // TODO: handle exception
            }
            System.out.println("往数据库插入数据...." + userName);
            resp.getWriter().write("success");
        }
    
        public boolean isFlag(HttpServletRequest request) {
            HttpSession session = request.getSession();
            String sesionToken = (String) session.getAttribute("sesionToken");
            String token = request.getParameter("token");
            if (!(token.equals(sesionToken))) {
                return false;
            }
            session.removeAttribute("sesionToken");
            return true;
        }
    }
  • 相关阅读:
    pip不是内部或外部命令也不是可运行的程序或批处理文件的问题
    动态规划 leetcode 343,279,91 & 639. Decode Ways,62,63,198
    动态规划 70.climbing Stairs ,120,64
    (双指针+链表) leetcode 19. Remove Nth Node from End of List,61. Rotate List,143. Reorder List,234. Palindrome Linked List
    建立链表的虚拟头结点 203 Remove Linked List Element,82,147,148,237
    链表 206 Reverse Linked List, 92,86, 328, 2, 445
    (数组,哈希表) 219.Contains Duplicate(2),217 Contain Duplicate, 220(3)
    重装系统
    java常用IO
    端口
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10404538.html
Copyright © 2011-2022 走看看