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;
        }
    }
  • 相关阅读:
    源代码的下载和编译
    Git使用入门
    搭建Android开发环境
    安卓系统移植与驱动开发概述
    第十章
    第九章
    第八章
    第七章读书笔记
    第六章读书笔记
    第五章读书笔记
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10404538.html
Copyright © 2011-2022 走看看