• 防止表单重复提交


         有时候由于网络原因会造成页面加载缓慢,导致用户频繁点击提交按钮,或者用户手动点击页面的刷新按钮,都会造成表单数据的重复提交,无形中增加了服务器的压力,并且有时候可能会造成无法挽回的损失。比如用户在购物网站选中一款商品,因为页面反应延迟,导致用户多点击了添加按钮,而结算时用户没有注意,就会造成用户多买了同一件商品。

          防止表单重复提交,可以从两方面着手解决。
    一、客户端:通过JavaScript来阻止 
         <%@ 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]] >
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"]] >
    <title]] > Insert title here</title]] >
    <script type="text/javascript"]] >
    var isCommited = false;
    function checkPost(){
    if(!isCommited){
    isCommited = true;
    return true;
    }else{
    var div = document.getElementById("message");
    div.innerHTML = "请不要重复提交!";
    return false;
    }
    }
    </script]] >
    </head]] >
    <body]] >
    <form action="/day02/Servlet2" method="post" onsubmit="return checkPost()"]] >
      姓名:<input type="text" name="name"]] >
      性别:<input type="text" name="sex"]] >
      <input type="submit" value="提交"]] >
      <div id="message"></div]] >
    </form]] >
    </body]] >
    </html]] >
    这种方式只能阻止用户重复点击提交按钮的提交,如果用户点击刷新按钮,或者点击后退按钮后再点提交,还会造成表单的重复提交。
     
    二、服务器:利用session来阻止
         具体思路:在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。
    下面是相关代码:

    index.jsp:
     
    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@ page import="java.util.UUID" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"]] >
    <html]] >
    <head]] >
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"]] >
    <title]] > Insert title here</title]] >
    </head]] >
    <body]] >
    <%
    String token = UUID.randomUUID().toString().replaceAll("-","");
        session.setAttribute("token",token);
    %>
    <form action="/day02/TokenServlet" method="post"]] >
    姓名:<input type="text" name="name"]] >
    性别:<input type="text" name="sex"]] >
    <input type="submit" name="提交"]] >
    <input type="hidden" name="formtoken" value="<%=token%>"]] >
    </form]] >
    </body]] >
    </html]] >  

    TokenServlet.java:
     
    package com.mac.servlet;
     
    import java.io.IOException;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    public class TokenServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    String formtoken = request.getParameter("formtoken");
    HttpSession session = request.getSession();
    String token = (String)session.getAttribute("token");
    if(formtoken.equals(token)){
    String name = request.getParameter("name");
    String sex = request.getParameter("sex");
    response.getWriter().println("姓名:"+name+";性别:"+sex);
    session.removeAttribute("token");
    }else{
    response.getWriter().println("请不要重复提交!");
    }
    }
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }
     


    这种方式实际上被称为令牌机制,那个唯一的标识符就是令牌。
    令牌机制不仅可以防止用户重复点击提交按钮带来的表单重复提交,还可以防止用户点击刷新按钮,以及后退后再点提交带来的表单重复提交问题。 
  • 相关阅读:
    [错误处理]UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
    [已解决]使用 apt-get update 命令提示 ...中被配置了多次
    linux各种版本查看方法
    [Pandas技巧] 如何把pandas dataframe对象或series对象转换成list
    linux下终止相关操作
    [错误处理]Vim卡死,无法输入是怎么回事?是不是按了Ctrl+S
    批量修改文件名称方法
    pycharm配置 自动运行指定脚本
    pip安装超时,更换国内镜像源安装
    命令行特殊字符名字转义
  • 原文地址:https://www.cnblogs.com/caowei/p/2013-12-13_form_submit.html
Copyright © 2020-2023  润新知